题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535

题意:有n个任务集合,需要在T个时间单位内完成。每个任务集合有属性,属性为0的代表至少要完成1个,属性为1的为至多完成1个,属性为2的为任意完成。

每个任务做完后都有个价值,问在T个时间单位内完成n个任务集合的任务获得的最大价值是多少?如果不能满足要求输出-1

首先先分析什么情况下输出-1:

因为属性为0的代表至少要完成1个,当遇到一个属性为0的任务集合里一个都无法完成的时候,输出-1.

其他的属性不予考虑,因为其中的每个任务都是可完成可不完成的。

那么问题就归结成为了:属性为0的,是一个分组背包,属性为1的是一个分组背包,属性为2的在组内是一个01背包。

这道题目的好处就是在于深入理解各种背包,我就是不太理解,所以刚开始就敲的各种挫,WA了好多次。

代码:

 import java.util.*;

 public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while( sc.hasNext() ){
int n = sc.nextInt();
int T = sc.nextInt();
int [][][] c = new int[n+1][111][2]; for(int i=1;i<=n;i++){
c[i][0][0] = sc.nextInt();
c[i][0][1] = sc.nextInt();
for(int j=1;j<=c[i][0][0];j++){
c[i][j][0] = sc.nextInt();
c[i][j][1] = sc.nextInt();
}
} int dp[][] = new int[n+1][111]; boolean flag = true; for(int i=1;i<=n;i++){
if( c[i][0][1]==0 ){
Arrays.fill(dp[i], -99999999);
for(int k=1;k<=c[i][0][0];k++){
for(int j=T;j>=c[i][k][0];j--){
dp[i][j] = Math.max(dp[i][j], Math.max(dp[i-1][j-c[i][k][0]]+c[i][k][1],dp[i][j-c[i][k][0]]+c[i][k][1]));
}
}
if( dp[i][T]<0 ) flag = false;
} else if( c[i][0][1] == 1 ){
for(int j=T;j>=0;j--){
dp[i][j] = dp[i-1][j];
for(int k=1;k<=c[i][0][0];k++){
if( j>=c[i][k][0]) dp[i][j] = Math.max(dp[i][j], dp[i-1][j-c[i][k][0]]+c[i][k][1]);
}
}
} else if( c[i][0][1] == 2 ){
for(int j=T;j>=0;j--){
dp[i][j] = dp[i-1][j];
}
for(int k=1;k<=c[i][0][0];k++){
for(int j=T;j>=c[i][k][0];j--){
dp[i][j] = Math.max(dp[i][j], dp[i][j-c[i][k][0]]+c[i][k][1]);
}
}
} } // for i if( flag ) System.out.println(dp[n][T]);
else System.out.println(-1); }
}
}

[HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)的更多相关文章

  1. HDU 3535 AreYouBusy (混合背包)

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

  2. HDU 3535 AreYouBusy 经典混合背包

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

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

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

  4. HDU 3535 AreYouBusy(混合背包)

    HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...

  5. hdu 3535 AreYouBusy

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

  6. hdu 3535 AreYouBusy 分组背包

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

  7. HDU 3535 分组混合背包

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

  8. HDU 2191(多重背包转换为01背包来做)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 ...

  9. HDU3535 AreYouBusy 混合背包

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

随机推荐

  1. ie8下table的colspan属性与max-with属性的显示错乱问题

    今天项目测试时发现了一个table的colspan样式问题,发现colspan单元格下的的元素设置max-with后将上面的第二列单元格撑开了,导致后面单元格的内容换行,先看代码: html代码: & ...

  2. TKinter之输入框

    输入框是 Entry,应用程序要取得用户的信息,输入框是必不可少的. 输入框比较重要的一个函数: get:返回值即输入框的内容 比如e是一个输入框,e['show']='*'就变成了密码框 小例子:用 ...

  3. MATLAB中trapz和cumtrapz函数

    这两个函数都是MATLAB中的内置函数,是基于梯形法则的数值积分公式 例如我们有函数y=x^3-2x-3,为了计算在[0,1]上的积分,可以这么做: 其中x和y分别是自变量和对应的值,trapz其实就 ...

  4. Linux 用户和用户组操作

    [认识/etc/passwd和/etc/shadow] 这两个文件可以说是linux系统中最重要的文件之一.如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的. /etc/pa ...

  5. nginx ssi 配置小细节(一)

    最近工作需要使用nginx的ssi (server side include)技术,在这里,将使用中的一点心得分享一下,也是一种备忘! 首先,nginx的ssi启用很简单,就只有三个最基本的指令: s ...

  6. jQuery validate在没有校验通过的情况下拒绝提交

    下面通过一个简单的例子说明,这个问题,可能是很多人遇到的,验证不通过的时候,依然提交了表单. HTML <form class="survey" id="surve ...

  7. SQL2008 强烈要求限制最大内存

    64位开了AWE没什么潜在问题,另外最大内存设置强烈要求改掉,不要用默认的,一般留2~3G内存给操作系统.你是怎么看到20多G是被awe用了的? 如果内存大的话,只留1GB给OS会有问题,可以参考下面 ...

  8. div+css之清除浮动

    当元素有浮动属性时,会对其父元素或后面的元素产生影响,会出现一个布局错乱的现象,可以通过清除浮动的方法来解决浮动的影响. 浮动的清理(clear): 值:none:默认值.允许两边都可以有浮动对象:l ...

  9. 使用 as 和 is 运算符安全地进行强制转换

    由于对象是多态的,因此基类类型的变量可以保存派生类型. 若要访问派生类型的方法,需要将值强制转换回该派生类型. 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastEx ...

  10. windows下boost库的基本使用方法

    因为boost都是使用模板的技术,所以所有代码都是写在一个.hpp头文件中.这样boost中的大部分内容是不需要编译生成相应的链接库,只需要设置下面的包含目录(或者设置一下环境变量),在源文件中包含相 ...