http://acm.hdu.edu.cn/showproblem.php?pid=3535 #include<iostream> using namespace std; #define N 101 int dp[N][N]; int Max(int a,int b,int c) { if(a<b) a=b; if(a<c) a=c; return a; } int main(void) { int n,v; while(~scanf("%d%d",&n,&v)) { memset(dp,0,sizeof(dp)); int i,j,k; for(i=1;i<=n;i++) { int m,flag; scanf("%d%d",&m,&flag); int w[N],val[N]; for(j=1;j<=m;j++) scanf("%d%d",&w[j],&val[j]); if(flag==0) { for(j=0;j<=v;j++) dp[i][j]=INT_MIN; for(j=1;j<=m;j++) for(k=v;k>=w[j];k--) dp[i][k]=Max(dp[i][k],dp[i-1][k-w[j]]+val[j],dp[i][k-w[j]]+val[j]); } else if(flag==1) { for(j=0;j<=v;j++) dp[i][j]=dp[i-1][j]; for(j=1;j<=m;j++) for(k=v;k>=w[j];k--) dp[i][k]=max(dp[i][k],dp[i-1][k-w[j]]+val[j]); } else { for(j=0;j<=v;j++) dp[i][j]=dp[i-1][j]; for(j=1;j<=m;j++) for(k=v;k>=w[j];k--) dp[i][k]=Max(dp[i][k],dp[i-1][k-w[j]]+val[j],dp[i][k-w[j]]+val[j]); } } dp[n][v]=max(dp[n][v],-1); printf("%d/n",dp[n][v]); } } 如果至少选一个,那么不能从上一层继承,而只能从本层或者上一层的v-w[i]中选; 如果之多选一个,那么不能从本层选;