题目:有一个超市大甩卖,但是每个人同样的商品只能拿一件,商品有价值和重量,现在有一个顾客序列,
每个人能拿的最大重量已知,求这些顾客,能拿到的最大价值的物品和。
分析:dp,01背包。看题目显然是01背包,每个物品只能取一种,每个顾客其实是一个单独的01背包过程,
求和即可。
注意:dp的初始化,和数据的清空。
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int w[1001];
int p[1001];
int f[1001];
int main()
{
int T,N,P,W,G,MW;
while ( scanf("%d",&T) != EOF )
while ( T -- ) {
scanf("%d",&N);
for ( int i = 0 ; i < N ; ++ i )
scanf("%d%d",&p[i],&w[i]);
//01背包
for ( int i = 0 ; i <= 30 ; ++ i )
f[i] = 0;
for ( int i = 0 ; i < N ; ++ i )
for ( int j = 30 ; j >= w[i] ; -- j )
if ( f[j] < f[j-w[i]] + p[i] )
f[j] = f[j-w[i]] + p[i];
scanf("%d",&G);
int sum = 0;
for ( int i = 0 ; i < G ; ++ i ) {
scanf("%d",&MW);
sum += f[MW];
}
printf("%d\n",sum);
}
return 0;
}