博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3535 AreYouBusy(综合背包)
阅读量:4462 次
发布时间:2019-06-08

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

题意:T时间内做一些任务,每个任务花费一些时间,获取一些快乐值,让快乐值最大。任务分成多组,每组三种情况之一:1.至少选一个 2.至多选一个 3.任意选

两天敲了两遍,很经典的题,得好好搞清背包才好做

代码:

#include
#include
#include
#include
#define inf (1<<28)#define nMAX 110int dp[2][nMAX],w[nMAX],p[nMAX];//滚动数组int max(int a,int b){ return a>b?a:b;}int main(){ int n,m,kind,size,i,j,k; int pre,cur; while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d%d",&kind,&size); for(k=1;k<=kind;k++) scanf("%d%d",&w[k],&p[k]); pre=(i+1)%2; cur=i%2; //至少选一个 if(size==0) { for(j=0;j<=m;j++) dp[cur][j]=-inf; for(k=1;k<=kind;k++)//这个是有顺序的 //for(j=w[k];j<=m;j++)//正序 for(j=m;j>=w[k];j--)//逆序,搞错了 { dp[cur][j]=max(dp[cur][j],max(dp[pre][j-w[k]]+p[k],dp[cur][j-w[k]]+p[k])); } } //至多选一个 else if(size==1) { for(j=0;j<=m;j++) dp[cur][j]=dp[pre][j]; for(k=1;k<=kind;k++) //因为dp多了一维,两个for,和j的顺序都不重要了 for(j=w[k];j<=m;j++) { dp[cur][j]=max(dp[cur][j],dp[pre][j-w[k]]+p[k]); } } //任意选 每个组就是一个01背包 else if(size==2) { for(j=0;j<=m;j++) dp[cur][j]=dp[pre][j]; for(k=1;k<=kind;k++) for(j=m;j>=w[k];j--) dp[cur][j]=max(dp[cur][j],dp[cur][j-w[k]]+p[k]); } } n=n%2; dp[n][m]=max(dp[n][m],-1); printf("%d\n",dp[n][m]); } return 0;}

  

  

转载于:https://www.cnblogs.com/sdau10kuaile/archive/2012/10/18/2730310.html

你可能感兴趣的文章
九度oj 题目1025:最大报销额
查看>>
数字及字符串
查看>>
【转载】OmniGraffle (二)基础绘图和模具
查看>>
一些提高开发效率的 Category
查看>>
拓扑排序基础题——排序
查看>>
转:iphone 申请证书
查看>>
Python就业方向
查看>>
一步步学习SPD2010--第二章节--处理SP网站(3)--创建网站层次架构
查看>>
TCP
查看>>
Excel常用函数大全
查看>>
团队-团队编程项目中国象棋-模块测试过程
查看>>
10个经典的C语言面试基础算法及代码
查看>>
普通的java Ftp客户端的文件上传
查看>>
视图系统
查看>>
Palindromes _easy version
查看>>
vue 小记
查看>>
CURRICULUM VITAE
查看>>
菱形缓冲器电路
查看>>
Groovy 程序结构
查看>>
使用 WordPress 的导航菜单
查看>>