多重背包(MultPack = ZeroOnePack + CompletePack)
HiHoCoder_offer6_04
题目4 : 奖券兑换
描述
小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品。
可供兑换的奖品一共有N件。第i件奖品需要Wi张奖券才能兑换到,其价值是Pi。
小Hi使用不超过M张奖券所能兑换到的最大奖品总价值是多少?
输入
第一行两个整数N,M。
接下来N行,每行两个整数Wi,Pi。
对于 50%的数据: 1≤N,M≤1000
对于 100%的数据: 1≤N,M≤105,1≤Pi,Wi≤10。
输出
一行一个整数,表示最大的价值。
- 样例输入
-
3 10
2 3
8 8
10 10 - 样例输出
-
11
明显是一个01背包问题,背了一下结果:过了一半的数据,剩下的TLE了。 仔细观察数据, 1 <= n , m <= 100000, 1 <= wi , pi <= 10。明显每个物品的价值和容量都非常小,也就是说不同容量不同不价值的物品最多有:10 * 10 = 100种。
既然这个数据项这么小,那么它就是这个问题的突破口。对于每一个物品,已知它的num(数量 )和 weight(重量) & value(价值),刚好可以使用多重背包。加上二进制优化,复杂度O(10 * 10 * log 100000);
代码:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int num[][];
int dp[]; void CompletePack(int weight, int value, int totWeight)
{
for(int w = weight; w <= totWeight; w ++){
dp[w] = max(dp[w], dp[w - weight] + value);
}
} void zeroOnePack(int weight, int value, int totWeight)
{
for(int w = totWeight; w >= weight; w --){
dp[w] = max(dp[w], dp[w - weight] + value);
}
} void multiPack(int weight, int value, int totWeight)
{
if(weight * num[weight][value] > totWeight){
CompletePack(weight, value, totWeight);
}else{
int k = , tmpNum = num[weight][value];
while(k < tmpNum){
zeroOnePack(k * weight, k * value, totWeight);
tmpNum -= k;
k <<= ;
}
zeroOnePack(tmpNum * weight, tmpNum * value, totWeight);
}
} int main()
{
int n,m,weight,value;
cin>>n>>m;
for(int i = ; i < n; i ++){
scanf("%d%d",&weight, &value);
num[weight][value] ++;
}
for(int i = ; i <= ; i ++){
for(int j = ; j <= ; j ++){
multiPack(i, j, m);
}
}
printf("%d\n",dp[m]);
return ;
}
————————++++++————————
多重背包(MultPack = ZeroOnePack + CompletePack)的更多相关文章
- HDU-2844 Coins(多重背包)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- DP大作战——多重背包
题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...
- poj 2392 多重背包
题意:有几个砖,给出高度,能放的最大高度和数目,求这些砖能垒成的最大高度 依据lim排个序,按一层一层进行背包 #include<cstdio> #include<iostream& ...
- poj 1276 多重背包
735 3 4 125 6 5 3 350 //735的最大额,3种,4个125,6个5,3个350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 ...
- hdu 1059 多重背包
题意:价值分别为1,2,3,4,5,6的物品个数分别为a[1],a[2],a[3],a[4],a[5],a[6],问能不能分成两堆价值相等的. 解法:转化成多重背包 #include<stdio ...
- poj1276 多重背包
//Accepted 1100 KB 47 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...
- poj2392 多重背包
//Accepted 868 KB 188 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...
- poj1014 dp 多重背包
//Accepted 624 KB 16 ms //dp 背包 多重背包 #include <cstdio> #include <cstring> #include <i ...
随机推荐
- 【Codeforces 404C】Restore Graph
[链接] 我是链接,点我呀:) [题意] 每个节点的度数不超过k 让你重构一个图 使得这个图满足 从某个点开始到其他点的最短路满足输入的要求 [题解] 把点按照dep的值分类 显然只能由dep到dep ...
- 【Codeforces 988D】Points and Powers of Two
[链接] 我是链接,点我呀:) [题意] 让你从一个集合中找出来一个子集 使得这个子集中任意两个数相减的绝对值是2^的整数次幂 且集合的大小最大 [题解] 考虑子集的个数为4个或4个以上 那么我们找到 ...
- 轰炸III
题目背景 一个大小为N*M的城市遭到了X次轰炸,每次都炸了一个每条边都与边界平行的矩形. 题目描述 在轰炸后,有Y个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮. ...
- Parallelized coherent read and writeback transaction processing system for use in a packet switched cache coherent multiprocessor system
A multiprocessor computer system is provided having a multiplicity of sub-systems and a main memory ...
- 20180705关于mysql binlog的解析方式
来自:https://blog.csdn.net/u012985132/article/details/74964366/ 关系型数据库和Hadoop生态的沟通越来越密集,时效要求也越来越高.本篇就来 ...
- kendo中需要kendo.default.min.css
kendo中需要kendo.default.min.css,这个默认是没有加入头文件的,还是需要手动加入一下 <link href="~/Scripts/kendo/styles/ke ...
- [bzoj 2463]谁能赢呢?(博弈论)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2463 分析:因为都是按最优策略,所以棋盘肯定都能走满,于是胜负关系就是判断n*n的奇偶 ...
- Docker创建PHP镜像
Step: 1. 创建Dockerfile FROM php:7.0-apache RUN chmod -R 755 /var/www 2. 创建镜像 docker build -t docker_n ...
- Android推断屏幕锁屏的方法总结
转载请注明:http://blog.csdn.net/heroxuetao/article/details/24639203 因为做一个项目,须要推断屏幕是否锁屏,发现网上方法非常多.可是比較杂.如今 ...
- JMeter—丰富报表功能PerfMon插件
可能有童鞋不知道PerfMon插件是干啥的.这里简要说一下: 在做负载測试时,我们要时刻关注server的CPU.MEM--的使用情况,可是JMeter本身对这些信息是不做收集的,这个时候PerfMo ...