题目链接

思路

乍一看这是一个01背包的裸题。但是数据范围\(10^5\)是无法承受的。

但是发现\(p_i\)和\(w_i\)只有10,也就是说最多只有100种物品。所以可以对他们进行分组。然后用二进制优化多重背包来做。

二进制优化多重背包

多重背包是指限定物品数量的一种背包问题。

多重背包可以转化为01背包来解。也就是枚举当前这种物品选多少个。但是这种做法的复杂度是\(O(NVS)\)S是背包内物品数量。

然后考虑优化上面的方法。因为每个数字都是可以用二进制来拼凑出来的。所以可以把每个物品的数量拆分成\(2^x\)这样就能拆分除\(log\)个物品。每个物品的价值都是\(2^x \times w[i]\)的形式。体积都是\(2^x \times p[i]\)的形式。

比如一种物品价值为3,体积为2,数量为13。那么这个物品可以拆分成以下物品:

\[w:3 \times 1 p:2 \times 1 \\
w:3 \times 2 p:2 \times 2 \\
w:3 \times 4 p:2 \times 4 \\
w:3 \times 6 p:2 \times 6 \]

注意最后一个6并不是\(2^x\)。

代码

/*
* @Author: wxyww
* @Date: 2019-01-20 09:01:19
* @Last Modified time: 2019-01-20 09:07:51
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int f[N],w[110],p[110],num[110],a[15][15];
int W,n,tot;
int main() {
n = read(),W = read();
int mx = 0,my = 0;
for(int i = 1;i <= n;++i) {
int x = read(),y = read();
a[x][y]++;
mx = max(mx,x);my = max(my,y);
}
for(int i = 1;i <= mx;++i) {
for(int j = 1;j <= my;++j) {
if(a[i][j]) {
++tot;
w[tot] = j;p[tot] = i;num[tot] = a[i][j];
}
}
}
for(int i = 1;i <= tot;++i) {
int k;
for(k = 1;num[i] - k >= k - 1;k <<= 1) {
for(int j = W;j >= p[i] * k;--j) {
f[j] = max(f[j],f[j - p[i] * k] + w[i] * k);
}
}
k = num[i] - k + 1;
for(int j = W;j >= p[i] * k;--j) {
f[j] = max(f[j],f[j - p[i] * k] + w[i] * k);
}
}
cout<<f[W];
return 0;
}

hihocoder1364 奖券兑换的更多相关文章

  1. hiho一下 第195周 奖券兑换[C solution][Accepted]

    时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品. 可供兑换的奖品一共有N件.第i件奖品需要Wi张奖券才能兑换到, ...

  2. 多重背包(MultPack = ZeroOnePack + CompletePack)

    HiHoCoder_offer6_04 题目4 : 奖券兑换 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品. ...

  3. MySQL_积分兑换的优惠券在某时间段内使用情况_ 20161215

    积分兑换的优惠券在某时间段内使用情况 SELECT a.城市,a.用户ID,a.优惠券ID,a.优惠券名称,a.积分兑换优惠券的张数,b.使用优惠券数量,a.积分兑换优惠券的金额,b.使用优惠券金额 ...

  4. 钱币兑换问题_完全背包&&拆分&&母函数

    ps:原来用新浪,可是代码的排版不是很好,所以用博客园啦,先容许我把从八月份开始的代码搬过来,从这里重新出发,希望这里可以一直见证我的成长. Time Limit: 2000/1000 MS (Jav ...

  5. hdu 1284 钱币兑换问题 完全背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284 递推公式:dp[i] = sum(dp[i], dp[i-C]) /* 钱币兑换问题 Time ...

  6. 钱币兑换问题(hd1284)

    钱币兑换问题 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   Output 对应每个输 ...

  7. HDU1284钱币兑换问题( 母函数打表)

    题意:在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. 原题http://acm.hdu.edu.cn/showproblem.php?pid=128 ...

  8. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. hdu1284经典钱币兑换问题

    钱币兑换问题. 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1284 完全背包. 这种是求背包问题最多的组合方案 参考了一些资料   http://blo ...

随机推荐

  1. jenkins结合svn检测版本变化执行shell脚本实现项目部署

    工具: centos 7 jenkins-2.138.2-1.1.noarch.rpm,2018年10月10号最新版(简单rpm包安装见https://www.cnblogs.com/dannylin ...

  2. 解决mybatis generator警告Cannot obtain primary key information from the database, generated objects may be incomplete

    使用 mybatis generator 生成pojo.dao.mapper时 经常出现 Cannot obtain primary key information from the database ...

  3. QTP 自动化测试--定义变量

    1 Dim suffixsuffix=get_currentdatetxt("001")

  4. WhiteHat Contest 11 : re1-100

    ELF文件,运行一下是要求输密码 die查了一下无壳 直接拖入ida 可以发现 这是它的判断函数 也就是说输入的总长度是42位第一个字符是123也就是0x7b 也就是'{'然后10位是"53 ...

  5. eclipse导入项目时,仅项目名出现红叉

    今天导入项目,项目名是红叉,百度了解决办法: 1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace- ...

  6. Redux 学习(1) ----- Redux介绍

    Redux 有三个基本的原则: 1,单一状态树,redux 只使用一个javascript 对象来保存整个应用的状态. 状态树样式如下: const state = { count: 0 } 2,状态 ...

  7. eclipse添加tomcat服务器

    在网上找资料好辛苦,还不对,自己试了好久,终于成功了 还是一如既往的分享 右键 弄好以后发现如此简单| _ |

  8. VM下安装Kali虚拟机

    VM下Kali虚拟机安装 下载kali Linux系统镜像 下载地址:http://mirrors.hust.edu.cn/kali-images/ 网页如下: kali官网:http://www.k ...

  9. BZOJ2084[Poi2010]Antisymmetry——回文自动机

    题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...

  10. 洛谷P1402 酒店之王

    传送门:>Here< 题意:有N个人去酒店,酒店共有P个房间,Q道菜.已知每个人喜欢特定的几个房间和几道菜,一个人是满意的当且仅当住了喜欢的房间,吃了喜欢的菜(一个人只能选一个房间一道菜) ...