多重背包可以拆分为01背包来做,最暴力的想法是把每类物品拆成一个个的,然后拆分后的物品各自为一类,做01背包。然而这样太慢了,我们可以用二进制(倍增)来优化拆分。

比如说我们有
1
10
100
1000
10000
这些二进制数,他们代表1, 2, 4, 8, 16
那么这些数可以组合出1~31之间所有的数
所以把物品倍增拆分,一样可以得到正确的答案。

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1010;
struct Bread{int mx, v, w;//最大个数,价值,花费/重量
}bre[MAXN];
int n,m,c0,d0,ans,sum;
int f[MAXN];
int main() {cin >> n >> m >> c0 >> d0;bre[0].mx = n/c0,bre[0].v = d0,bre[0].w = c0;for(int i=1; i<=m; i++) {int a,b,c,d;cin >> a >> b >> c >> d;bre[i].mx = a/b;bre[i].v = d;bre[i].w = c;   }for(int i=0; i<=m; i++) {int a[22], t = 0, sum = 0;//循环到20 开到22for(int k=0; k<=20; k++) {sum += 1<<k;if(sum > bre[i].mx) {sum -= 1<<k;break;}a[++t] = (1<<k);}a[++t] = bre[i].mx - sum; //二进制划分后剩下的部分for(int k=1; k<=t; k++) {int vk = bre[i].v*a[k];int wk = bre[i].w*a[k];for(int j=n; j>=wk; j--) {f[j] = max(f[j],f[j-wk]+vk);}}}cout << f[n];return 0;
}

Codeforces 106C Buns - 多重背包 - 二进制拆分相关推荐

  1. 多重背包---二进制拆分---java小知识

  2. [多重背包+二进制优化]HDU1059 Dividing

    题目链接 题目大意: 两个人要把一堆宝珠,在不能切割的情况下按照价值平分,他们把宝珠分成6种价值,每种价值的宝珠n个. n<=200000 思考: 首先如果加和下来的价值是一个偶数 那么还分毛啊 ...

  3. HDU 5445 Food Problem 多重背包+二进制优化

    据说也可以用单调队列优化多重背包,但是我不会,所以还是选择了二进制优化... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:先给n,m, ...

  4. Dividing(多重背包二进制优化)

    题意:有价值为1-6的六种玻璃球,现在告诉你各种玻璃球的个数,问能否将这些玻璃球分成两份,使得两份的总价值相等 既然要等分,那么总价值必定是偶数,所以价值和为奇数是无法等分. 但价值和为偶数时,我们可 ...

  5. jzoj100044-abcd【多重背包,二进制压缩,dp】

    正题 题目大意 给出长度为nnn的序列a,b,c,da,b,c,da,b,c,d 求一个序列eee满足 (∑i=1nei∗ci)=0(e∈[ai..bi])(\sum _{i=1}^ne_i*c_i) ...

  6. hdu2844 Coins(普通的多重背包 + 二进制优化)

    看完背包九讲的多重背包之后,这题目应该可以轻松做出来了 模型: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的 ...

  7. POJ 1014 Dividing【多重背包+二进制优化】

    大意: 价值1, 2, 3, --, 6的物品分别a1, a2, --, a5, a6件 问能否把这些物品分成两份,使其具有相同的价值(所有物品必须全部用上) 分析: 给个物品有多件,即多重背包 只要 ...

  8. zcmu-1919: kirito(多重背包——二进制优化)

    Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...

  9. 12.14补卡,多重背包二进制优化

    题目链接:22背包专题 [Cloned] - Virtual Judge (vjudge.net) 思路:多重背包的主要思路就是把每一个物品分开放,从而达到每个物品拿与不拿全部遍历到.但是当物品数量过 ...

  10. ZCMU-1919 kirito's 星爆气流斩(多重背包+二进制优化)

    Problem C: kirito's 星爆气流斩 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 148  Solved: 37 [Submit][S ...

最新文章

  1. jenssen不等式的证明
  2. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
  3. ASP.NET MVC
  4. LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序
  5. 国际旅游管理专业跨专业考计算机,旅游管理考研我想跨专业考旅游管理专业的研究 – 手机爱问...
  6. 无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)
  7. linux apache tomcat ajp,Linux下apache tomcat ajp session複製
  8. JSON中的多行字符串
  9. javascript学习之数组的使用三 slice方法 splice方法
  10. 蓝桥杯每日真题之砝码称重(01背包)
  11. 类和对象之Scala程序
  12. 高速电路设计与仿真之PCB篇(一)
  13. 桌面美化 Python tkinter倒计时工具
  14. Flutter发送表情接收表情库
  15. WPF学习系列 游戏-选张图片做成9宫格拼图
  16. 写给喜欢数学和不喜欢数学的朋友们
  17. 常见的配置中心:Apollo(二)-接入Apollo
  18. 蓝牙设备名字和地址ID如何设置
  19. C语言自学保姆教程——第一节--编译准备与第一个C程序
  20. 查询oracle授权信息,oracle授权查询

热门文章

  1. rust-crate
  2. UE官网ARPG游戏学习笔记1
  3. matlab normx-x0_【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)
  4. 一周内,在闲鱼上被疯狂转了2万次的Redis资料!!!
  5. 润肤悦颜各种偏方秘方
  6. Eslint+Prettier 实现代码 git 提交时自动格式化及修复
  7. OA新增百亿市场,蓝凌、钉钉靠“智能OA”占稳C位
  8. c语言程序设计题目湖南大学,湖南大学C语言期末考试样卷
  9. DAOS整体设计分析 (一)
  10. ECS云服务器新手上路