首页 > 代码库 > hdu 3535 背包综合题
hdu 3535 背包综合题
1 /* 2 有n组背包,每组都有限制 3 0、至少选一项 4 1、最多选一项 5 2、任意选 6 */ 7 #include <iostream> 8 #include <cstdio> 9 #include <cstring>10 using namespace std;11 12 const int maxn=105;13 const int INF=0xfffffff;14 int dp[maxn][maxn];//第i组,剩余时间j的最大价值15 int w[maxn],v[maxn];16 inline int max(int a,int b){return a>b?a:b;}17 int main()18 {19 int n,t,m,flag,i,j,k;20 while(~scanf("%d%d",&n,&t))21 {22 memset(dp[0],0,sizeof(dp));23 for(i=1;i<=n;i++)24 {25 scanf("%d%d",&m,&flag);26 for(j=1;j<=m;j++) scanf("%d%d",w+j,v+j);27 if(flag==0)28 {29 for(j=0;j<=t;j++) dp[i][j]=-INF;30 for(j=1;j<=m;j++)31 for(k=t;k-w[j]>=0;k--)32 dp[i][k]=max(dp[i][k],max(dp[i-1][k-w[j]]+v[j],dp[i][k-w[j]]+v[j]));//这组不选,第一次选,多次选33 }34 else if(flag==1)35 {36 for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j];37 for(j=1;j<=m;j++)38 for(k=t;k-w[j]>=0;k--)39 dp[i][k]=max(dp[i][k],dp[i-1][k-w[j]]+v[j]);//这组不选,第一次选40 }41 else42 {43 for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j];44 for(j=1;j<=m;j++)45 for(k=t;k-w[j]>=0;k--)46 dp[i][k]=max(dp[i][k],max(dp[i-1][k-w[j]]+v[j],dp[i][k-w[j]]+v[j]));//这组不选,第一次选,多次选47 }48 }49 int ans=max(dp[n][t],-1);50 printf("%d\n",ans);51 }52 return 0;53 }
hdu 3535 背包综合题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。