ACwing 5. 多重背包问题 II(二进制拆分+DP)
文章目录
- 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(NVlogS)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)相关推荐
- AcWing 5. 多重背包问题 II(二进制优化)
题目链接 https://www.acwing.com/problem/content/5/ 思路 part1 受了完全背包和01背包的启发我们不难想到,一种高效的方法来优化,我们讲物品的次数做一个二 ...
- 多重背包问题和“二进制拆分”
预告:我用两年写的新书<算法竞赛>,已于2022年2月交给清华大学出版社,预计于2022年7月出版.<算法竞赛>是一本"大全",内容覆盖"基础-中 ...
- 多重背包问题以及二进制优化
2020.12.30开始学习AcWing算法<算法竞赛进阶指南>: 上传博客方便复习. 多重背包问题(N<= 100): //Wecccccccc //2020.12.31 #inc ...
- 多重背包问题的二进制优化(C语言)
之前一直不理解,为什么多重背包与01背包是类似的 用朴素法解决多重背包时,操作的集合分为不取i物品,取一个i物品,取两个i物品--取s个物品 所以解题的思路就是在01背包的基础上再加一重循环,将以上集 ...
- 多重背包的二进制拆分法
在多重背包的直接拆分法中,个数为$c[i]$的物体被拆成$c[i]$种不同的物体 这样就使得物体的种类增加了很多,使得算法效率很低. 上述方法把$c[i]$拆成$c[i]$个1,于是任意选择可以表示出 ...
- ACwing 4. 多重背包问题 I(DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 种物品和一个容量是 V 的背包. 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使物品体积总和不超过 ...
- AcWing 4. 多重背包问题(多重背包 朴素版)
题目链接 https://www.acwing.com/problem/content/4/ 思路 对于每一个物品我们在选择的时候是有限制的,所以我们进行选择的时候需要枚举一下可以选择的情况,注意的是 ...
- 动态规划之背包问题(01背包问题、完全背包问题、多重背包问题 I、多重背包问题 II 、分组背包问题)
这里是目录
- 动态规划:多重背包问题
一.多重背包问题1 ACwing 4.多重背包问题I 一.状态表示 f[i][j],表示从前i个物品当中选,总体积不超过j的选法,求解的是最大值 二.集合划分 f[i][j]根据第i见物品选择的数量进 ...
最新文章
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
- 解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题
- 在CentOS上把MySQL从5.5升级到5.6
- Java线程池实现原理及其在美团业务中的实践
- 纹理过滤模式中的Bilinear、Trilinear以及Anistropic Filtering
- 数据中心架构有哪些组件?
- python pandas for循环_python – 将一个for循环应用于Pandas中的多个DataFrame
- HTML的onclick的this指向
- 深度学习网络模型AlexNet
- LeetCode 199. 二叉树的右视图(DFS 按层queue)
- 常见的 HTTP 状态代码及原因
- 【渝粤教育】电大中专药物分析技术基础 (2)_1作业 题库
- [数论] 快速傅里叶变换FFT
- Oracle External Table学习
- 绿城中国的数字化转型之大中台实践
- HTML特效动画、焦点图
- 产品经理面试题汇总(1)
- 元语言基础技术之:在JS中如何自由地创建函数
- 查询成绩第三名的学生信息
- 团队RESTful 风格API规范