文章目录

  • 1. 题目
  • 2. 解题

1. 题目

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N≤1000
0<V≤2000
0<vi,wi,si≤2000
提示:
本题考查多重背包的二进制优化方法。

输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:
10

题目来源:https://www.acwing.com/problem/content/description/5/

2. 解题

本题是在 4. 多重背包问题 I 的基础上,加大了数据规模,直接用上一题的代码是没问题的,但是时间复杂度很高,会超时

  • 将 si 拆分成 1,2,4,8, … ,2^k, 剩余的数(这些数,每个数表示一个新的物品,这个新的物品是原来的n个组合成的),这些数可以组合成 1 - si 的任意数
  • 然后应用 01 背包解决问题
  • 时间复杂度 O(NVlog⁡S)O(NV \log S )O(NVlogS),空间复杂度 O(V)O(V)O(V)
#include<bits/stdc++.h>
using namespace std;int main()
{int N, V, vi, wi, si, maxprice = 0;cin >> N >> V;vector<int> dp(V+1, -1);dp[0] = 0;// dp[v] 表示体积为 v 时装的最大价值for(int i = 0; i < N; ++i){cin >> vi >> wi >> si;for(int k = 1; si > k; k*=2)//二进制拆分{int price = wi*k;//合并成一个物品,其价值int v = vi*k;//其体积si -= k;//剩余物品数量for(int j = V-v; j >= 0; --j)// 01 背包,状态更新{if(dp[j] == -1)//状态不存在continue;dp[j+v] = max(dp[j+v], dp[j]+price);maxprice = max(maxprice, dp[j+v]);}}if(si > 0)//还剩余的,单独打包成一个物品{int price = wi*si;int v = vi*si;for(int j = V-v; j >= 0; --j)// 01 背包,状态更新{if(dp[j] == -1)//状态不存在continue;dp[j+v] = max(dp[j+v], dp[j]+price);maxprice = max(maxprice, dp[j+v]);}}}cout << maxprice << endl;return 0;
}

855 ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

ACwing 5. 多重背包问题 II(二进制拆分+DP)相关推荐

  1. AcWing 5. 多重背包问题 II(二进制优化)

    题目链接 https://www.acwing.com/problem/content/5/ 思路 part1 受了完全背包和01背包的启发我们不难想到,一种高效的方法来优化,我们讲物品的次数做一个二 ...

  2. 多重背包问题和“二进制拆分”

    预告:我用两年写的新书<算法竞赛>,已于2022年2月交给清华大学出版社,预计于2022年7月出版.<算法竞赛>是一本"大全",内容覆盖"基础-中 ...

  3. 多重背包问题以及二进制优化

    2020.12.30开始学习AcWing算法<算法竞赛进阶指南>: 上传博客方便复习. 多重背包问题(N<= 100): //Wecccccccc //2020.12.31 #inc ...

  4. 多重背包问题的二进制优化(C语言)

    之前一直不理解,为什么多重背包与01背包是类似的 用朴素法解决多重背包时,操作的集合分为不取i物品,取一个i物品,取两个i物品--取s个物品 所以解题的思路就是在01背包的基础上再加一重循环,将以上集 ...

  5. 多重背包的二进制拆分法

    在多重背包的直接拆分法中,个数为$c[i]$的物体被拆成$c[i]$种不同的物体 这样就使得物体的种类增加了很多,使得算法效率很低. 上述方法把$c[i]$拆成$c[i]$个1,于是任意选择可以表示出 ...

  6. ACwing 4. 多重背包问题 I(DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 种物品和一个容量是 V 的背包. 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使物品体积总和不超过 ...

  7. AcWing 4. 多重背包问题(多重背包 朴素版)

    题目链接 https://www.acwing.com/problem/content/4/ 思路 对于每一个物品我们在选择的时候是有限制的,所以我们进行选择的时候需要枚举一下可以选择的情况,注意的是 ...

  8. 动态规划之背包问题(01背包问题、完全背包问题、多重背包问题 I、多重背包问题 II 、分组背包问题)

    这里是目录

  9. 动态规划:多重背包问题

    一.多重背包问题1 ACwing 4.多重背包问题I 一.状态表示 f[i][j],表示从前i个物品当中选,总体积不超过j的选法,求解的是最大值 二.集合划分 f[i][j]根据第i见物品选择的数量进 ...

最新文章

  1. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
  2. 解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题
  3. 在CentOS上把MySQL从5.5升级到5.6
  4. Java线程池实现原理及其在美团业务中的实践
  5. 纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering
  6. 数据中心架构有哪些组件?
  7. python pandas for循环_python – 将一个for循环应用于Pandas中的多个DataFrame
  8. HTML的onclick的this指向
  9. 深度学习网络模型AlexNet
  10. LeetCode 199. 二叉树的右视图(DFS 按层queue)
  11. 常见的 HTTP 状态代码及原因
  12. 【渝粤教育】电大中专药物分析技术基础 (2)_1作业 题库
  13. [数论] 快速傅里叶变换FFT
  14. Oracle External Table学习
  15. 绿城中国的数字化转型之大中台实践
  16. HTML特效动画、焦点图
  17. 产品经理面试题汇总(1)
  18. 元语言基础技术之:在JS中如何自由地创建函数
  19. 查询成绩第三名的学生信息
  20. 团队RESTful 风格API规范

热门文章

  1. JavaScript中的定时器
  2. 机器学习之朴素贝叶斯算法的推理及相关知识总结
  3. 数据结构探险——树篇
  4. 上机环境是什么意思_Python能不能自学,可以找到什么工作?
  5. jmeter+Fiddler:通过Fiddler抓包生成jmeter脚本
  6. 位运算实现四则运算(C++实现)
  7. 带日期的bean转为json(bean-JSON)
  8. HDU 1213 How Many Tables【并查集】
  9. myeclipse启动报JVM terminated. Exit code=1
  10. Linux 下用C语言连接 sqlite