HDU 1712 ACboy needs your help AC男需要你的帮助 (分组的背包)
分组背包问题:有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。
题意:
要用m天的时间来学n门课程,给出一个v[n][m]的矩阵,v[i][j]代表的是花j天的时间学习第i门课程所获得的价值,求能获得的最大价值?(当然同一门课不可多次修读)
思路:
很裸的分组背包。有点类似于01背包,那就转成01背包的思想。
第1层循环是“组”,第2层循环是当前背包容量(即m天),第3层循环是该组内的每件物品。说点容易懂的话,每组中只能选1件,那么有多少组就是最多就是多少件了,但是由于背包容量的限制,可能放不下这么多件,那还得再考虑一下搭配问题,所以任意一组也可以不选。那么问题就是在第 i 组中挑还是不挑,若挑,要挑哪一件的问题了?
看伪码(这样可以保证同组至多挑一件):
for 所有的组k //组
for v=V..0 //当前背包容量
for 所有的物品i属于组k //组内物品
f[v]=max{f[v],f[v-c[i]]+w[i]} //时刻要保证v-c[i]>=0,总不能让数组的下标为负数吧?
如果每组仅有1件物品,也就是可以撤掉第3层循环,那么就是01背包了。但是这里由于有每组由任意多件物品,为了保证同组内只装1件,所以先考虑完此组后再考虑别的组;考虑完用没有装此组的状态去更新装了此组的状态。
78MS
#include <bits/stdc++.h>
#define num 105
using namespace std;
int a[num][num];
int dp[num];
void cal(int n,int m)
{
int i,j,t;
for(i=;i<n;i++) //组
for(j=m;j>;j--) //当前背包容量
for(t=;t<=j;t++) //同一组内的所有物品,刚好每组m个
dp[j]=max( dp[j] , dp[j-t]+a[i][t-] );
}
void main()
{
int n,m,i,j;
while(scanf("%d%d",&n,&m),n!=) //n门课,m天
{
for(i=;i<n;i++)
for(j=;j<m;j++)
scanf("%d",&a[i][j]);
cal(n,m);
printf("%d\n",dp[m]);
memset(a,,sizeof(a)); //清内存。
memset(dp,,sizeof(int)*(m+)); //清内存
}
}
AC代码
HDU 1712 ACboy needs your help AC男需要你的帮助 (分组的背包)的更多相关文章
- HDU 1712 ACboy needs your help(包背包)
HDU 1712 ACboy needs your help(包背包) pid=1712">http://acm.hdu.edu.cn/showproblem.php? pid=171 ...
- HDU 1712 ACboy needs your help 典型的分组背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 ACboy needs your help Time Limit: 1000/1000 MS ( ...
- hdu 1712 ACboy needs your help 分组背包
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 Problem ...
- HDU 1712 ACboy needs your help (分组背包模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...
- hdu 1712 ACboy needs your help
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 1712 ACboy needs your help(分组背包入门题)
http://acm.hdu.edu.cn/showproblem.php?pid=1712 题意: 有个人学习n门课程,a[i][j]表示用j分钟学习第i门课程所能获得的价值,背包容量为一共有m时间 ...
- 分组背包 例题:hdu 1712 ACboy needs your help
分组背包需求 有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大. 解题模 ...
- HDU 1712 ACboy needs your help(分组背包)
题意:给你n的课程组,每个课程组有m个课程,每个课程有一个完成时间与价值.问在m天内每组课程组最多选择一个,这样可以得到的最大价值是多少 题解:分组背包,其实就是每个课程组进行01背包,再在课程组内部 ...
- HDU - 1712 - ACboy needs your help 【分组背包】
<题目链接> 题目大意:有n个课程,现在花M天来学习这些课程,学习每个课程花的天数所得到的价值不同,求M天怎么分配学习才能得到的价值最大.(这些课程得到的价值和所花天数的关系由矩阵给出) ...
随机推荐
- jquery ajax + struts2用例
ajax var url = '/itsm/contract/contract!deleteShopItemById.action'; var shopItemId= selectRows[x].da ...
- 2010辽宁省赛F(字典树,动态规划)
#include<bits/stdc++.h>using namespace std;int n,x;char s[10010];char a[31010];int val[100010] ...
- 2017-10-23 NOIP模拟赛
叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线.. ...
- 树状数组 洛谷P3616 富金森林公园
P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...
- html_entity_decode与htmlentities函数
htmlentities() 函数把字符转换为 HTML 实体.html_entity_decode() 函数把 HTML 实体转换为字符.例子:$a = '<div> <p> ...
- day14内置函数作业详解
day14题目 day14作业及默写 1,整理今天所学内容,整理知识点,整理博客. 2,画好流程图. 3,都完成的做一下作业(下面题都是用内置函数或者和匿名函数结合做出): 4,用map来处理字符串列 ...
- jmeter beanshell Typed variable declaration : Object constructor错误
从数据库取值和响应值做比较,使用beanshell如下: import org.json.JSONArray; import org.json.JSONObject; res_str = prev.g ...
- Eclipse设置每行代码的长度
打开 Window -> preferences -> java -> code style -> formatter -> edit -> line wrappi ...
- 73th LeetCode Weekly Contest Custom Sort String
S and T are strings composed of lowercase letters. In S, no letter occurs more than once. S was sort ...
- count(1), count(*), count(col) 的区别
1.count(1)和count(*)都是统计表的总行数,两者执行结果相同.表没有主键或者唯一键索引时,两者都进行全表扫描:表上主键或者唯一键索引时,使用主键或者唯一键索引. 2.count(col) ...