hdu3535AreYouBusy(分组背包问题)
来源:互联网 发布:php array判断 编辑:程序博客网 时间:2024/04/23 18:44
常见的有三种,
一,每组最多取一个,
一维数组的伪代码
for 所有的组k
for v = V to 0
for 所有的i属于组k
f[v] = max{f[v], f[v -c[i]] + w[i]}
注意顺序不能写反,因为要限制每组最多取一个
二,每组任意取
既然上面的顺序是限制每组最多取一个,那调换一下顺序即可,其实就是01背包。
一维数组的伪代码
for 所有的组k
for 所有的i属于组k
for v = V to 0
f[v] = max{f[v], f[v -c[i]] + w[i]}
三,每组至少取一个
没见过一维的伪代码,
dp[ki}[i}表示当前不选,dp[ki-1}[i-b[ki}}+c[ki}表示这是第一个选,
dp[ki}[i-b[ki}}+c[ki}表示再在这一组中选。
初始化时记得ki==0,赋值0,
其他赋值-inf
dp[ki}[i}=max(dp[ki}[i},dp[ki-1}[i-b[ki}}+c[ki},dp[ki}[i-b[ki}}+c[ki})
//分开写时要注意顺序!!!
下面这道题是这三种的综合,由于第三种情况要用二维写,所以就都用二维写。
if(type==0) for(int i=0;i<=T;i++) dp[ni][i]=-inf;else for(int i=0;i<=T;i++) dp[ni][i]=dp[ni-1][i];
上面代码是将状态从上一个组传递到当前组。
#include <iostream>#include <stdio.h>#include <algorithm>#include <stdlib.h>#include <stack>#include <vector>#include <string.h>#include <queue>#define msc(X) memset(X,-1,sizeof(X))#define ms(X) memset(X,0,sizeof(X))typedef long long LL;using namespace std;const int inf=0x7fffffff;int dp[102][102];int main(int argc, char const *argv[]){ int N,T; while(scanf("%d %d",&N,&T)==2){ ms(dp); for(int ni=1;ni<=N;ni++) { int num,type; scanf("%d %d",&num,&type); if(type==0) for(int i=0;i<=T;i++) dp[ni][i]=-inf; else for(int i=0;i<=T;i++) dp[ni][i]=dp[ni-1][i]; if(type==0){//至少选一个 while(num--){ int c,g; scanf("%d %d",&c,&g); for(int i=T;i>=c;i--) { dp[ni][i]=max(dp[ni][i],dp[ni][i-c]+g); dp[ni][i]=max(dp[ni][i],dp[ni-1][i-c]+g); } } } else if(type==1){//至多选一个 while(num--){ int c,g; scanf("%d %d",&c,&g); for(int i=T;i>=c;i--) { dp[ni][i]=max(dp[ni][i],dp[ni-1][i]); dp[ni][i]=max(dp[ni][i],dp[ni-1][i-c]+g); } } } else{//随意 while(num--){ int c,g; scanf("%d %d",&c,&g); for(int i=T;i>=c;i--) { dp[ni][i]=max(dp[ni][i],dp[ni-1][i]); dp[ni][i]=max(dp[ni][i],dp[ni][i-c]+g); dp[ni][i]=max(dp[ni][i],dp[ni-1][i-c]+g); } } } } if(dp[N][T]<0) puts("-1"); else printf("%d\n",dp[N][T] ); } return 0;}
0 0
- hdu3535AreYouBusy(分组背包问题)
- hdu3535AreYouBusy【分组背包综合题】
- hdu3535AreYouBusy (分组背包,WA了很多次)
- 背包问题(分组背包)
- 分组背包问题(三)
- 分组背包问题
- 分组背包问题
- hdu1712 分组背包问题
- 分组的背包问题
- 分组背包问题解法
- 分组背包问题
- 分组的背包问题
- 分组背包问题
- HDOJ1712 分组背包问题
- 分组的背包问题(背包九讲)
- 背包分组问题的解法
- P06: 分组的背包问题
- P06: 分组的背包问题
- 嵌入式复习9
- 开发记录---python爬虫之gooseeker尝试
- aptitude命令的使用
- 疑问解答
- 闲杂小记(l六)
- hdu3535AreYouBusy(分组背包问题)
- jQuery修改DOM结构
- C#多线程编程
- 史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置
- oracle中的as
- webpack-react
- 实现拖拽进度条
- ios静态库.a文件打包
- Codeforces Round #362 (Div. 2) B. Barnicle 科学记数法、表达式处理