题目链接:UVa 10130 SuperSale
题意:超市有一些东西,重量为wi,价值为vi,一家人去购物,每个人能背的重量有限,并给出每个人的承重能力,每个商品只能卖一次,使得一家人购物的价值最大,求出这个最大值,若是一个人去购物 那就是简单的01背包问题,多个人 那就是多组。01背包外边套一层。
#include<iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
/**
多个01背包
UVa 10130 - SuperSale
*/
const int MAX_N = 1005;
int maxV[105][35];
int weight[MAX_N];
int value[MAX_N];
int family[105];
int T,V, N;
int main()
{
scanf("%d",&T);
while(T--)
{
memset(value,0,sizeof(value));
memset(weight,0,sizeof(weight));
memset(family,0,sizeof(family));
memset(maxV,0,sizeof(maxV));
int i, j;
cin>>N;
for(i = 0; i < N; ++i)
cin>>value[i]>>weight[i];
int p_num;
cin>>p_num;//人数
for(i = 0;i < p_num;i++)
cin>>family[i];
for(int k = 0;k < p_num;k++)
{
for(i = 0; i < N; ++i)
{
for(j = family[k]; j >= weight[i]; --j)
{
int tmp = maxV[k][j-weight[i]]+value[i];
maxV[k][j] = (maxV[k][j] > tmp) ? maxV[k][j] : tmp;
}
}
}
int sum = 0;
for(i = 0;i < p_num;i++)
sum += maxV[i][family[i]];
cout<<sum<<endl;
}
return 0;
}