标签:include class nbsp pre using under return set cstring
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3535
//不想写题解,这道题让我对背包的理解更深了,我相信我不会忘记的。。。。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int INF=0x3f3f3f3f; int dp[105][105]; int t[105],g[105]; int main() { int N,T; while(scanf("%d%d",&N,&T)==2) { memset(dp,0,sizeof(dp)); for(int i=1; i<=N; i++) { int n,s; scanf("%d%d",&n,&s); for(int k=1; k<=n; k++) scanf("%d%d",&t[k],&g[k]); if(s==0) ///至少选一件 { for(int j=0; j<=T; j++) dp[i][j]=-INF; for(int j=1; j<=n; j++) for(int k=T; k>=t[j]; k--) dp[i][k]=max(dp[i][k],max(dp[i][k-t[j]]+g[j],dp[i-1][k-t[j]]+g[j])); } else if(s==1) ///最多选一件 { for(int j=0; j<=T; j++) dp[i][j]=dp[i-1][j]; for(int j=1; j<=n; j++) for(int k=T; k>=t[j]; k--) dp[i][k]=max(dp[i][k],dp[i-1][k-t[j]]+g[j]); } else ///随便选 { for(int j=0; j<=T; j++) dp[i][j]=dp[i-1][j]; for(int j=1; j<=n; j++) for(int k=T; k>=t[j]; k--) dp[i][k]=max(dp[i][k],max(dp[i-1][k-t[j]]+g[j],dp[i][k-t[j]]+g[j])); } } if(dp[N][T]<=0) dp[N][T]=-1; printf("%d\n",dp[N][T]); } return 0; }
标签:include class nbsp pre using under return set cstring
原文地址:http://www.cnblogs.com/a-clown/p/6021022.html