分析:这里就是一个完全背包,需要注意的就是初始化和最后的输出情况
dp[j]=max{ dp[j],dp[j-c[i]]+w[i] }
#include<stdio.h>
const int INF=0XFFFFFF;
int main()
{
int N,M,V,c[2010],w[2010],dp[50000];
scanf("%d",&N);
while (N--)
{
//读取数据
scanf("%d%d",&M,&V);
for(int i=1;i<=M;i++)
scanf("%d%d",&c[i],&w[i]);
//数据初始化
for(int i=0;i<=V;i++)
dp[i]=-INF;
dp[0]=0;
//利用递推关系
for(int i=1;i<=M;i++)
for(int j=c[i];j<=V;j++)
dp[j]=dp[j]>dp[j-c[i]]+w[i]?dp[j]:dp[j-c[i]]+w[i];
//输出。这里是要求背包装满
if(dp[V]<0)
printf("NO
");
else
printf("%d
",dp[V]);
}
return 0;
}
《背包九讲》里面有关于初始化的问题。