与01背包区别就是东西有无限多个
/*完全背包*/
#include <stdio.h>
#include <string.h>
int max(int a,int b){
return a>b?a:b;
}
int main()
{
int n;
scanf("%d",&n);
int c[2000],w[2000],f[50000]; //c物品重量 w物品价值
int m,v,i,j; //m物品个数 v背包负重
while(n--){
scanf("%d%d",&m,&v);
for(i=0;i<m;i++){
scanf("%d%d",&c[i],&w[i]);
}
memset(f,0,sizeof(f));
for(i=0;i<m;i++){
for(j=1;j<=v;j++){ //顺序
if(j>=c[i]){
f[j]=max(f[j],f[j-c[i]]+w[i]); //状态转移方程为f[i][j]=max(f[i-1][j],f[i][j-c[i]]+w[i])
}
}
}
printf("%d\n",f[v]);
}
return 0;
}