學習完全揹包
// 題目1494:Dota.cpp: 主項目文件。
#include "stdafx.h"
#include <cstdio>
#include <cstring>
#define max(a,b) a>b?a:b
const int N=203;
int value[N],volumn[N];
const int M=1003;
int dp[M];
int main()
{
int n,m,totalVolumn;
while(~scanf("%d%d%d",&n,&m,&totalVolumn)){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d%d",&volumn[i],&value[i]);
for(int i=1;i<=m;i++){
int num;
scanf("%d",&num);
int nVol=0,nVal=0;
while(num--){
int temp;
scanf("%d",&temp);
nVol+=volumn[temp];
nVal+=value[temp];
}
int more;
scanf("%d",&more);
nVal+=more;
volumn[n+i]=nVol;
value[n+i]=nVal;
}
for(int i=1;i<=n+m;i++){
for(int j=volumn[i];j<=totalVolumn;j++)
dp[j]=max(dp[j],dp[j-volumn[i]]+value[i]);
}
printf("%d\n",dp[totalVolumn]);
}
return 0;
}