AcWing 5. 多重背包问题 II
题面:
有件物品和一个容量是 的背包。
第件物品最多有 件,每件体积是 ,价值是 。
求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。
输出最大价值。
先前的思路[1]:将 个物品分成 份
由此转换为 7
就可以拆解为 1 1 1 1 1 1 1
。
二进制优化思路:将 个物品分成 份
实际上,就像每一个小于等于 7
的数都可以通过 1 2 4
这三个数字组合出来一样,
最少需要
对于
例如,对于 1 2 4 3
。既然每一个 1 2 4
组合出来,那么它们加上
时间复杂度: →
#include <bits/stdc++.h> using namespace std; const int N = 2010; int n, m, f[N]; struct good { int v, w; }; int main() { vector<good> goods; cin >> n >> m; //拆堆 for (int i = 0; i < n; i++) { int v, w, s; cin >> v >> w >> s; for (int j = 1; j <= s; j *= 2) { s -= j; goods.push_back({ v * j, w * j }); } if (s > 0) goods.push_back({ v * s, w * s }); } //01板子 for (auto g : goods) for (int j = m; j >= g.v; j--) f[j] = max(f[j], f[j - g.v] + g.w); cout << f[m]; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)