HDU3535 AreYouBusy(混合背包)

http://acm.hdu.edu.cn/showproblem.php?pid=3535

题意:

给你n个工作集合,给你T的时间去做它们。给你m和s。说明这个工作集合有m件事能够做,它们是s类的工作集合(s=0,1,2,s=0说明这m件事中最少得做一件,s=1说明这m件事中最多仅仅能做一件,s=2说明这m件事你能够做也能够不做)。

再给你ci和gi代表你做这件事要用ci的时间,能获得gi的快乐值。

求在T的时间内你能获得的最大快乐值。

分析:

首先假设存在最优解, 我们能够互换不同工作集合的处理顺序, 依旧能得到最优解. 那么我们以下仅仅须要处理每一个单独的工作集合就可以.

令dp[i][j]==x表示处理完前i组工作集,所花时间<=j时的快乐值为x。

每得到一组工作就进行一次DP,所以dp[i]为第i组的结果。以下对三种情况进行讨论。

1.    该集合内至少要选1件工作时. 要保证至少选1个第i类工作, 能够从第i-1类的结果dp[i-1]来更新dp[i].也能够用           01背包的思想, 从本类的前一个工作更新后一个工作.

初始化:dp[i]全为负无穷.(即-INF)

状态转移方程为:

dp[i][k]=max{dp[i][k],dp[i-1][k-cost[j]]+val[k],dp[i][k-cost[j]]+val[j] }

2.    该集合内最多选1件工作时. 仅仅能从上一层的结果dp[i-1]来更新dp[i]了.(想想为什么)

初始化:dp[i]==dp[i-1].

状态转移方程为dp[i][k]=max{dp[i][k],dp[i-1][k-cost[j]]+val[k]}.

3.    该集合内工作能够随便选. 这就是1个普通的01背包问题了.

初始化:dp[i]==dp[i-1].

状态转移方程为:

dp[i][k]=max{dp[i][k],dp[i-1][k-cost[j]]+val[k],dp[i][k-cost[j]]+val[j] }

终于所求:dp[n][t]的值.

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+5;
#define INF 1e8 int n;
int t;
int dp[maxn][maxn];
int cost[maxn];
int val[maxn]; int main()
{
while(scanf("%d%d",&n,&t)==2)
{
memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++)
{
int m,s;
scanf("%d%d",&m,&s);
for(int k=1;k<=m;k++)
scanf("%d%d",&cost[k],&val[k]); if(s==0)//至少选1个的01背包问题
{
for(int j=0;j<=t;j++) dp[i][j]=-INF; for(int k=1;k<=m;k++)
for(int j=t;j>=cost[k];j--)
{
dp[i][j] = max( dp[i][j] , dp[i][j-cost[k]]+val[k] ); //1
dp[i][j] = max( dp[i][j] , dp[i-1][j-cost[k]]+val[k] );//2
//上面两句顺序互换就会出错!为什么?
}
}
else if(s==1)//至多选1个的背包问题
{
for(int j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; for(int k=1;k<=m;k++)
for(int j=t;j>=cost[k];j--)//j能够正序或逆序枚举
dp[i][j] = max( dp[i][j] , dp[i-1][j-cost[k]]+val[k] );
}
else if(s==2)//随便选的01背包问题
{
for(int j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; for(int k=1;k<=m;k++)
for(int j=t;j>=cost[k];j--)//j仅仅能逆序枚举
dp[i][j] = max( dp[i][j] , dp[i][j-cost[k]]+val[k] );
}
} int ans = max(dp[n][t],-1);
printf("%d\n",ans);
}
return 0;
}

HDU 3535 AreYouBusy(混合背包)的更多相关文章

  1. HDU 3535 分组混合背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...

  2. hdu 3535 AreYouBusy 分组背包

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  3. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

  4. hdu 3535 AreYouBusy

    // 混合背包// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,/ ...

  5. HDU3535 AreYouBusy 混合背包

    题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...

  6. [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...

  7. HDU 3535 AreYouBusy 经典混合背包

    AreYouBusy Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  8. HDU 3535 AreYouBusy (混合背包之分组背包)

    题目链接 Problem Description Happy New Term! As having become a junior, xiaoA recognizes that there is n ...

  9. UESTC 424 AreYouBusy --混合背包

    混合三种背包问题. 定义:dp[i][k]表示体积为k的时候,在前i堆里拿到的最大价值. 第一类,至少选一项,dp初值全赋为负无穷,这样才能保证不会出现都不选的情况.dp[i][k] = max(dp ...

随机推荐

  1. 【WIN10】判斷程序運行在哪個平台

    其中的一個方法是: string x = AnalyticsInfo.VersionInfo.DeviceFamily; 判斷 x  的值,有”Windows.Mobile“,”Windows.Des ...

  2. ThinkPHP3.2设置异常页面404跳转页面

    在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面,类如下图: 0 «上一篇:div非弹出框半透明遮罩实现全屏幕遮盖css实现»下一篇:利于反向代理绑定任意的域名 po ...

  3. [USACO11DEC]Grass Planting

    题目大意: 有一棵结点个数为n的树,有m个操作,可以将一段路径上每条边的权值+1或询问某一个边的权值. 思路: 树链剖分+线段树. 轻重链划分本身比较简单,主要需要思考如何用线段树维护每条链. 当x, ...

  4. UOJ 12 猜数 数学题

    [UER #1]猜数 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n 的值.然后在脑内把 n 写成了 a ...

  5. Charles基本使用—http抓包、手机抓包、数据篡改

    本文主要介绍如下内容: 1.Charles如何抓取HTTP报文 2.Charles如何抓取手机上的HTTP包 3.使用Charles篡改数据信息 一.Charles抓取HTTP包 1.Charles的 ...

  6. 使用LibZ合并.Net程序集,支持WPF

    最近写了一个小的WPF程序,发布的时候发现依赖着两三个20~30k的小dll的,感觉有点不爽,就想把它合并一下.以前在WinForm下用过微软的ILMerge合并程序集,不过记得它对WPF程序支持不大 ...

  7. How far away ?(DFS)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. java linux 项目常常无故被关闭 进程无故消息

    布了几个项目.竟然天天会自己主动的挂掉.急了.花时间攻克了一下.总结方案例如以下: 1.磁盘满了.这大家都懂,清一下 2.tomcat在关闭的或是重新启动的时候,经常后台进程没有被关闭.须要用ps a ...

  9. git 忽略文件 .gitignore 以及规则

    git提供了文件忽略系统,当对工作区某个目录或文件设置了忽略后,在执行status查看状态时,被忽略的文件即使存在也不会显示出来. 这样我就可以把那些不需要上传,不需要保留的文件或目录忽略掉(比如一些 ...

  10. Big Number------HDOJ杭电1212(大数运算)

    Problem Description As we know, Big Number is always troublesome. But it's really important in our A ...