//完全背包:
#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]);
}
}