https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1071
简单0 1问题,先输入一个T,表示测试数据组数,然后对于每组数据,输入所有可能的P和W,然后是相应的人数,找出每个人选择的最大值,然后相加,即为所求结果。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<iomanip>
#include<numeric>
#define L(a,b,c) for(int a = b;a >= c;a --)
#define M(a,b,c) for(int a = b;a <= c;a ++)
#define N(a,b) memset(a,b,sizeof(a));
#define MAXX(a,b) ((a)>(b)?a:b)
#define MINN(a,b) ((a)<(b)?a:b)
const int MAX=1<<30;
const int MIN=-MAX;
using namespace std;
struct data
{
int x;
int y;
} a[1010];
int dp[10000];
int main()
{
int T,n,m;
cin>>T;
while(T--)
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i].x>>a[i].y;
cin>>m;
int sum=0,t;
for(int i=1; i<=m; i++)
{
N(dp,0)
cin>>t;
for(int j=1; j<=n; j++)
{
for(int k=t; k>=a[j].y; k--)
dp[k]=max(dp[k],dp[k-a[j].y]+a[j].x);
}
sum+=dp[t];
}
cout<<sum<<endl;
}
return 0;
}