博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3535 混合背包
阅读量:5061 次
发布时间:2019-06-12

本文共 2266 字,大约阅读时间需要 7 分钟。

分三种情况。

至少取一种 那可以直接取 或者从上一种情况来取.dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v,dp[i][k-a[j].c]+a[j].v);

至多取一种 只能从上一种情况来取 dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v);

任意取 dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v,dp[i][k-a[j].c]+a[j].v);

#include
#include
#define maxn 110#define INF 99999999int dp[maxn][maxn];struct node{ int v; int c;}a[maxn];int max(int x,int y){ return x>y?x:y;}int main(){ int i,j,n,m,t,s,k; while(scanf("%d%d",&n,&t)!=EOF) { memset(dp,0,sizeof(dp));//初始化为0,保证dp[1][0]=0; for(i=1;i<=n;i++) { scanf("%d %d",&m,&s); for(j=1;j<=m;j++) scanf("%d%d",&a[j].c,&a[j].v); if(s==0)//至少1 { for(k=0;k<=t;k++)//保证下一次选的时候一定选一个 dp[i][k]=-INF; for(j=1;j<=m;j++) { for(k=t;k>=a[j].c;k--) { //下面的顺序不能调换 如果dp[i-1]在前面,有可能就更新了2次,v被加了2次。 //可以考虑一下 //直接选当前的 先更新自己, dp[i][k]=max(dp[i][k],dp[i][k-a[j].c]+a[j].v); //从前一种情况来选当前的 dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v); } } } else if(s==1)//最多选一个 所以从前一种来考虑 { for(k=0;k<=t;k++) dp[i][k]=dp[i-1][k]; for(j=1;j<=m;j++) { for(k=t;k>=a[j].c;k--) { dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v); } } } else if(s==2)//任意 { for(k=0;k<=t;k++) dp[i][k]=dp[i-1][k]; for(j=1;j<=m;j++) { for(k=t;k>=a[j].c;k--) { dp[i][k]=max(dp[i][k],dp[i][k-a[j].c]+a[j].v); dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v); } } } } dp[n][t]=max(dp[n][t],-1); printf("%d\n",dp[n][t]); }}

 

转载于:https://www.cnblogs.com/sweat123/p/4735744.html

你可能感兴趣的文章
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>