//完全背包: #include<stdio.h> #include<algorithm> #include<string.h> struct sb { int x,y; }ok[2005]; int main() { int a,b,n,m,v,q; scanf("%d",&q); while(q--) { int yi[50001]={0}; memset(yi,-999999,sizeof(yi));//除yi[0]为0外全部初始化为负无穷。 yi[0]=0; scanf("%d%d",&n,&v); for(a=1;a<=n;a++) scanf("%d%d",&ok[a].x,&ok[a].y); for(b=1;b<=n;b++) { for(m=ok[b].x;m<=v;m++)//一个物品可以拿多次。。 { if(yi[m]<(yi[m-ok[b].x]+ok[b].y)) yi[m]=yi[m-ok[b].x]+ok[b].y; } } if(yi[v]>0)//说明可以正好装满。。 printf("%d\n",yi[v]); else printf("NO\n"); } }
原题链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=311;
看这个题,和oj上289的苹果比较一下,看看区别。。修改一下代码就可以ac了!!
//苹果 #include<stdio.h> #include<algorithm> struct sb { int x,y; }ok[1001]; int main() { int a,b,n,m,v; while(1) { int yi[1001]={0}; scanf("%d%d",&n,&v); if(n==0&&v==0) break; for(a=1;a<=n;a++) scanf("%d%d",&ok[a].x,&ok[a].y); for(b=1;b<=n;b++) { for(m=v;m>0;m--)//一个物品只能拿一次。。。 { if(ok[b].x<=m) { if(yi[m]<(yi[m-ok[b].x]+ok[b].y)) yi[m]=yi[m-ok[b].x]+ok[b].y; } } } printf("%d\n",yi[v]); } }