混合背包 hdu5410 CRB and His Birthday
传送门:点击打开链接
题意:你有M块钱,如今有N件商品
第i件商品要Wi块,假设你购买x个这种商品。你将得到Ai*x+Bi个糖果
问能得到的最多的糖果数
思路:很好的一道01背包和全然背包结合的题目
首先,对于第i件商品,假设仅仅买1个,得到的价值是Ai+Bi
假设在买1个的基础上再买。得到的价值就是Ai
也就是说,除了第一次是Ai+Bi。以后购买都是Ai
那么,我们是否能将i商品拆分成两种商品,当中两种商品的代价都是Wi,
第一种的价值是Ai+Bi,可是仅仅同意买一次
另外一种的价值是Ai。能够无限次购买
接下来我们来讨论这样拆的正确性
理论上来讲,买另外一种之前。必需要买第一种
可是对于这道题,由于Ai+Bi>=Ai是必定的,由于Bi肯定是非负
所以对于代价同样。价值大的肯定会被先考虑
换句话来说,假设已经開始考虑另外一种商品了。那么第一种商品就肯定已经被加入到背包里了~
所以。这题我们把n件商品拆分成2*n件商品。对于第一种商品做01背包,对于另外一种商品做全然背包,这样就把题目转换成了很熟悉的题目。也就能顺利AC了
#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define FIN freopen("input.txt","r",stdin) using namespace std;
typedef long long LL;
typedef pair<int, int> PII; const int MX = 2e4 + 5; int dp[MX];
int A[MX], B[MX], rear; int main() {
int T, V, n; //FIN;
scanf("%d", &T);
while(T--) {
memset(dp, 0, sizeof(dp)); scanf("%d%d", &V, &n);
for(int i = 1; i <= n; i++) {
int w, a, b;
scanf("%d%d%d", &w, &a, &b); A[i] = w; B[i] = a + b;
A[i + n] = w; B[i + n] = a;
} for(int i = 1; i <= n; i++) {
for(int j = V; j >= A[i]; j--) {
dp[j] = max(dp[j], dp[j - A[i]] + B[i]);
}
}
for(int i = 1 + n; i <= 2 * n; i++) {
for(int j = A[i]; j <= V; j++) {
dp[j] = max(dp[j], dp[j - A[i]] + B[i]);
}
} printf("%d\n", dp[V]);
}
return 0;
}
混合背包 hdu5410 CRB and His Birthday的更多相关文章
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- Codevs 3269 混合背包(二进制优化)
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为V ...
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
- codevs 3269 混合背包(复习混合背包)
传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #inclu ...
- HDU3535 AreYouBusy 混合背包
题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...
- [codevs3269]混合背包
题目大意:一道混合背包模板. 解题思路:分三种情况讨论,01和完全没什么问题,多重背包需要把物品分成$\log W[i]$件,然后01即可,分成W[i]件01会TLE. 读优大法好! C++ Code ...
- CODE[VS] 3269 混合背包
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 背包体积为V ,给出N ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...
随机推荐
- 对python的想法
作为计算机专业的学生,在编程语言之余,我认为掌握一门脚本语言是很必要的.尤其是现在在数据分析,AI,机器学习等各个方面都大放异彩的python.相比于之前接触过的Java,C,C++乃至于php等语言 ...
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- c++中set容器的功能及应用。
set的特性是,所有元素都会根据元素的键值自动排序(默认为升序),set中不允许两个元素有相同的键值. set基本操作: 1.头文件 #include<set>. 注:一定要加上using ...
- hihoCoder #1047 Random Tree
题意 给出点数为 $n$($n \le 1000$)的完全图 $K_n$,带边权.随机出 $K_n$ 的一棵生成树 $T$.求 $T$ 上任意两点间距离的期望. 解法 固定两点 $u$.$v$($u ...
- HDU——2054A==B?
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- BZOJ2302 [HAOI2011]Problem c 【dp】
题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...
- vim 翻页命令记录
vim命令: ctrl-f:往前翻一页(forward) ctrl-b:往后翻一页(backward) ctrl-d:往下翻半页(down) ctrl-u:往上翻半页(up)
- maven项目打包 编码gbk的不可映射字符
中文系统默认gbk编码格式,你的代码是utf8格式的.所以报错 <build> <plugins> <plugin> <groupId>org.apac ...
- 2018.7.31 Noip2018模拟测试赛(十六)
日期: 七月最后一天 总分: 300分 难度: 提高 ~ 省选 得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...
- 洛谷 [P1948] 电话线
二分答案 首先,最大值最小,就是二分答案 #include <iostream> #include <cstdio> #include <algorithm> #i ...