【题目来源】
https://www.luogu.com.cn/problem/P1776

【题目描述】
终于,破解了千年的难题。小 F 找到了王室的宝库,里面堆满了无数价值连城的宝物。
这下小 F 可发财了,嘎嘎。但是这里的宝物实在是太多了,小 F 的采集车似乎装不下那么多宝物。看来小 F 只能含泪舍弃其中的一部分宝物了。
小 F 对宝库里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小 F 有一个最大载重为 W 的采集车,宝库里总共有 n 种宝物,每种宝物的价值为 vi,重量为 wi,每种宝物有 mi 件。小 F 希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。

【输入格式】
第一行为一个整数 n 和 W,分别表示宝物种数和采集车的最大载重。
接下来 n 行每行三个整数 vi,wi,mi。

【输出格式】
输出仅一个整数,表示在采集车不超载的情况下收集的宝物的最大价值。

【算法分析】
多重背包问题通常可转化成01背包问题求解。但若将每种物品的数量拆分成多个1的话,时间复杂度会很高,从而导致TLE。所以,需要利用二进制优化思想。即:
一个正整数n,可以被分解成1,2,4,…,2^(k-1),n-2^k+1的形式。其中,k是满足n-2^k+1>0的最大整数。

例如,假设给定价值为2,数量为10的物品,依据二进制优化思想可将10分解为1+2+4+3,则原来价值为2,数量为10的物品可等效转化为价值分别为1*2,2*2,4*2,3*2,即价值分别为2,4,8,6,数量均为1的物品。

【算法代码】

#include <bits/stdc++.h>
using namespace std;int n,V;
const int maxn=100005;
int vol[maxn],val[maxn];
int c[maxn];int main() {cin>>n>>V;int cnt=0;for(int i=1; i<=n; i++) {int wi,vi,nge;cin>>vi>>wi>>nge;int k=1;while(k<=nge) {cnt++;vol[cnt]=wi*k;val[cnt]=vi*k;nge-=k;k*=2;}if(nge>0) {cnt++;vol[cnt]=wi*nge;val[cnt]=vi*nge;}}n=cnt;for(int i=1; i<=n; i++) {for(int j=V; j>=vol[i]; j--)c[j]=max(c[j],c[j-vol[i]]+val[i]);}cout<<c[V]<<endl;return 0;
}/*
in:
4 20
3 9 3
5 9 1
9 4 2
8 1 3out:
47
*/

【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/109363826
https://www.luogu.com.cn/problem/P1776

洛谷 P1776:宝物筛选 ← 多重背包问题 二进制优化相关推荐

  1. 洛谷P1776 宝物筛选

    传送门啦 这个题就快好多,这次打的代码相比较旅行商的背包,我用了预处理,先处理成01背包,然后直接dp. 没有在dp中进行,可能会快一点吧. #include <iostream> #in ...

  2. 九大背包问题专题--多重背包问题(二进制优化方法;单调队列问题)

    3.多重背包问题1 题目: 有N件物品和一个容量是V的背包. 第i种物品最多有si件,每件的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值总和最大. 输 ...

  3. 多重背包问题二进制优化解法

    如果是一般方法是把n的物品切为n个1份,这样要超时,以二进制的形式切可以优化,多的部分提出来即可. #include<bits/stdc++.h> using namespace std; ...

  4. P1776 宝物筛选+P1555 尴尬的数字+P8845 [传智杯 #4 初赛] 小卡和质数

    P1776 宝物筛选 题目描述 终于,破解了千年的难题.小 FF 找到了王室的宝物室,里面堆满了无数价值连城的宝物. 这下小 FF 可发财了,嘎嘎.但是这里的宝物实在是太多了,小 FF 的采集车似乎装 ...

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

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

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

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

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

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

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

    1919: kirito's 星爆气流斩 Time Limit: 2 Sec  Memory Limit: 128 MB Description 主角kirito是使用世界首款完全潜行游戏" ...

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

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

最新文章

  1. js 获取input type=file 文件,并且上传
  2. 计算机意外地重新启动或遇到错误。windows安装无法继续。若要安装windows 请单击 确定 重新启动计算机...
  3. 比特币现金受到美国和欧洲市场的欢迎
  4. BZOJ2648: SJY摆棋子
  5. 用户名或用户域名_给自己的Hexo+GitHub静态博客绑定自己的专属域名
  6. vue 表单 验证 async-validator
  7. C/C++之函数返回值为指针或者是引用时常见错误总结
  8. Centos7安装nginx教程!超简单
  9. python脚本打包成linux命令_Python脚本文件打包成可执行文件的方法
  10. seaborn 绘图sns.relplot
  11. python二进制处理详述
  12. android 菜鸟面单打印_Android TSC热敏标签打印机打印
  13. 对称加密算法之Java SM4算法应用 附可用工具类
  14. Docker的概念及基本指令学习(从安装、管理、核心概念到docker file 、 服务编排、集群)
  15. BS架构与CS架构的区别(最详细)
  16. 中国知名个人站长排行TOP91
  17. requests登录知乎新版
  18. 年薪超1400万美元,库克即将卸任,谁接掌苹果CEO?
  19. MySQL运行机制-从入门到京东
  20. 【CVPR2021】AdderSR: Towards Energy Efficient Image Super-Resolution

热门文章

  1. android应用自定义字体
  2. 模型稳定性指标—PSI
  3. HDU 6868 Absolute Math
  4. 报错:‘xxxx‘ is declared but its value is never read.Vetur(6133)
  5. 公司分支使用5G链路和总部建立IPS加密隧道配置案例
  6. Fielding博士论文导读----第3章
  7. 手把手教你考研《数据结构》代码题
  8. 最佳队形(动态规划)
  9. ABAQUS单位制/常用单位对照表/单位换算
  10. teams 无法登录 错误代码 - caa70004