hdu3535 背包大杂汇
Posted a_clown_cz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu3535 背包大杂汇相关的知识,希望对你有一定的参考价值。
题目链接: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; }
以上是关于hdu3535 背包大杂汇的主要内容,如果未能解决你的问题,请参考以下文章