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天怎么分配学习才能得到的价值最大.(这些课程得到的价值和所花天数的关系由矩阵给出) ...
随机推荐
- Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
在尝试内核开发之前,需要对内核有个整体的了解. 主要内容: 获取内核源码 内核源码的结构 编译内核的方法 内核开发的特点 1. 获取内核源码 内核是开源的,所有获取源码特别方便,参照以下的网址,可以通 ...
- Entity Framework 分页处理
在SQL中进行分页,网上已经有很多例子了,在这里我使用Linq to SQL让C#来生成分页代码,首先创建分页的扩展方法: public static class Extensions { /// & ...
- 【关于msyql5.6创建存储过程的一些记录】
-- 秒杀执行存储过程DELETE $$ -- console的结束符号由;转换成 $$-- in输入参数:out:输出参数-- ROW_COUNT():返回上条dml影响的条数: 小于0:sql语句 ...
- .Net Core WebApi返回日期格式的问题
环境:.net core 2.1 webapi 问题简介: 返回DateTime,前端接收到的字符有时候为2018-01-01T12:01:01,有时候为2018-01-01T01:01:01.722 ...
- 在Android中使用Protocol Buffers(中篇)
本文来自网易云社区. FlatBuffers 编码原理 FlatBuffers的Java库只提供了如下的4个类: ./com/google/flatbuffers/Constants.java ./c ...
- 读《JavaScript权威指南》笔记(二)
1.加号运算和比较运算符的区别 对于数字和字符串操作符来说,加号运算符和比较运算符的行为都有所不同,前者更偏爱字符串,如果它的其中一个操作数是字符串的话,则进行字符串连接操作.而比较运算符则更偏爱数字 ...
- having - 函数输出限制
引用:https://zhidao.baidu.com/question/406745181.html 对函数输出进行限制 栗子: 比如,我们可能只希望看到Store_Information数据表中销 ...
- 3、kvm配置vnc
配置kvm通过vnc访问 virsh edit privi-server 添加如下配置: <graphics type='vnc' port='5901' autoport='no' liste ...
- 自定义xml spring bean
一. xml中bean解析过程 扫描META-INF下面的 spring.schemas bean定义对应的xsd位置,在IDEA中可以辅助校验) spring.handlers xmlns对应 ...