学习完全背包
// 题目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; }