摘要: 从下向上分析 每个状态s[i][j]代表从底部到这个位置的最大值,状态转移方程 s[i][j]=max{s[i+1][j],s[i+1][j+1]}+w[i][j] 1 #include 2 3 int main() 4 { 5 int i,j,k,n; 6 char v[1001][1001]; 7 long s[2][1001]; 8 scanf("%d",&n); 9 for(i=1;i=1;i--)17 {18 for(j=1;js[(i+1)%2][j+1])21 s[i%2][j]=s[(i+... 阅读全文
posted @ 2013-07-03 16:45 simplesslife 阅读(218) 评论(0) 推荐(0)
摘要: 每个状态表示到达这个状态所挖地雷的最大数,状态转移方程 s[i]=max{s[j]}+w[i] if(v[i][j]=1) 1 #include 2 3 int main() 4 { 5 int i,j,k,n,w[21],s[21],y[21]; 6 bool v[21][21]; 7 scanf("%d",&n); 8 for(i=1;is[i])28 {29 s[i]=s[j]+w[j];y[i]=j;30 }31 }32 y[1]=0;33 s[n]+=w[n];34... 阅读全文
posted @ 2013-07-03 16:25 simplesslife 阅读(155) 评论(0) 推荐(0)
摘要: 设置一个状态数组表示到达这个重量的一张牌的序号,状态转移方程pos[i][j]=i {if(pos[i][j-v[i]]!=0)} 1 #include 2 #include 3 4 int main() 5 { 6 int tag,t,n,i,j,k,v[101]; 7 char pos[2][100001],pos1[101]; 8 scanf("%d",&t); 9 scanf("%d",&n);10 memset(pos[0],0,sizeof(char)*(t+1));11 j=0;12 for(i=1;i=0)25 ... 阅读全文
posted @ 2013-07-02 12:19 simplesslife 阅读(210) 评论(0) 推荐(0)
摘要: 每个状态代表可表示的种类数 状态转移方程 s[j]=s[j-c[i]]+s[j] 1 #include 2 #include 3 4 int main() 5 { 6 int v,n,i,j,k,c[26],s[10001]; 7 scanf("%d %d",&v,&n); 8 for(i=1;i=0) 19 if(s[j-c[i]]>0)20 s[j]+=s[j-c[i]];21 }22 }23 printf("%d\n",s[n]);24 while(true);25 ... 阅读全文
posted @ 2013-07-02 11:08 simplesslife 阅读(164) 评论(0) 推荐(0)
摘要: 1 #include 2 #include 3 4 struct thing 5 { 6 int w[3],v[3]; 7 int size; 8 }; 9 10 int main()11 {12 struct thing t[61];13 int i,tag,tag2,j,k,n,m,v,w,p;14 int s[2][32001];15 memset(s[0],0,sizeof(int)*32001);16 scanf("%d %d",&n,&m);17 tag=1;18 for(i=1;i=0&&s[(i-1)%... 阅读全文
posted @ 2013-07-02 10:38 simplesslife 阅读(216) 评论(0) 推荐(0)
摘要: 0/1背包问题,状态转移方程 if(j-w[i]>=0) s[i][j]=max(s[i-1][j],s[i-1][j-w[i]]+w[i]*v[i]) else s[i][j]=s[i-1][j]可能有超内存的问题,实际上只需要两个转移的状态就可以了。 1 #include 2 #include 3 4 5 int main() 6 { 7 int i,tag,j,n,m,w[26],v[26],s[2][30001]; 8 scanf("%d %d",&n,&m); 9 for(i=1;is[(i-1)%2][j])18 {19 ... 阅读全文
posted @ 2013-07-02 00:50 simplesslife 阅读(156) 评论(0) 推荐(0)
摘要: 根据草药的不可重复性而作为最外层循环,状态转移方程if(j>=w[i]) s[i][j]=max(s[i-1][j],s[i-1][j-w[i]+v[i]) else s[i][j]=s[i-1][j] 1 #include 2 #include 3 4 5 6 int main() 7 { 8 int t,m,i,j,w[101],v[101],s[101][1001]; 9 scanf("%d %d",&t,&m);10 for(i=1;i<=m;i++)11 {12 scanf("%d %d",&w[i],&am 阅读全文
posted @ 2013-07-02 00:13 simplesslife 阅读(175) 评论(0) 推荐(0)
摘要: 把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量,也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。 1 #include 2 #include 3 #include 4 5 int cmp(const void *a,const void *b) 6 { 7 return *(int *)a-*(int *)b; 8 } 9 10 int main()11 {12 int n,i,j,k;13 int val[101],max[101];14 bool val1[101][10001];15 s... 阅读全文
posted @ 2013-07-01 11:46 simplesslife 阅读(237) 评论(0) 推荐(0)
摘要: 设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重n1 n2 n3 n5 n10 n20(表示各种砝码的个数)Total=N(N表示可以称的不同重量的个数)1 1 0 0 0 0Total=3对每个砝码扫描状态转移方程:opt[j]=opt[j-w[i]]{opt[j]=opt[j-w[i]];opt[j-w[i]]=true;} 1 #include 2 #include 3 4 int main() 5 { 6 int w[6]={1,2,3,5,10,20}; 7 int n[6],i,j,k,total; 8 bool val[1001]; ... 阅读全文
posted @ 2013-06-30 21:28 simplesslife 阅读(267) 评论(0) 推荐(0)
摘要: 有一个箱子容量为V(正整数,0第一行为一个正整数V表示箱子的容量,第二行一个正整数N表示物品个数,接下来N行列出这N个物品各自的体积。单独一行,表示箱子最小的剩余空间。2468312797 1 #include 2 #include 3 4 int main() 5 { 6 bool val[20001]; 7 memset(val,0,sizeof(bool)*20001); 8 int i,j,V,n,w[31]; 9 scanf("%d",&V);10 scanf("%d",&n);11 for(i=1;i0;i--)15 {16 阅读全文
posted @ 2013-06-30 21:03 simplesslife 阅读(445) 评论(0) 推荐(0)