Description
给出一个背包,背包有容量C,再给出N组物品,每组物品有ki种,每种物品有对应的体积Vi,价值Pi,每组物品至多选一种,且最多取一件。求用背包装物品,能获得的最大总价值是多少。
Input
文件的第一行一个数T,表示测试用例数。
接下来T个测试用例。
每个测试用例第一行两个数,N, C(N, C < 1000),表示物品的组数和背包的容量
接下来描述N组物品,
每一组的第一行是一个数ki(ki < 100),表示该组物品的种类数
接下来的ki行,每一行是两个数Vi, Pi(Vi < 1.5×C, Pi < 1000)分别表示物品的体积,价值。
Output
为每个测试用例输出一行结果:所装物品价值的最大值。
Sample Input
1
2 10
2
10 1
3 5
2
2 2
2 3
Sample Output
8
代码入下:
#include<bits/stdc++.h>
using namespace std;
int b[1010];
int v[110],p[110];
int main(){
int T,n,C;
scanf("%d",&T);
while(T--){
memset(b,0,sizeof(b));
scanf("%d%d",&n,&C); //n组,最大容量C
for(int i=1;i<=n;i++){ //第i组
int k;
scanf("%d",&k);
for(int x=1;x<=k;x++){ //输入第i组的元素
scanf("%d%d",&v[x],&p[x]);
}
for(int j=C;j>0;j--){ //逆序遍历
for(int z=1;z<=k;z++){
if(j>=v[z])
b[j]=max(b[j],b[j-v[z]]+p[z]);
}
}
}
printf("%d \n",b[C]);
}
return 0;
}