多重背包 单调队列优化
https://www.acwing.com/problem/content/6/
#include <iostream>
#include <memory.h>
#include <deque>
#include <stdio.h>
using namespace std;
/*
https://www.acwing.com/problem/content/6/
有 N种物品和一个容量是 V的背包。
第 i种物品最多有 si件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
输入格式
第一行两个整数,N,V (0<N≤1000, 0<V≤20000)
,用空格隔开,分别表示物品种数和背包容积。
接下来有 N行,每行三个整数 vi,wi,si
,用空格隔开,分别表示第 i种物品的体积、价值和数量。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N≤1000
0<V≤20000
0<vi,wi,si≤20000
提示
本题考查多重背包的单调队列优化方法。
输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10
*/
const int N = 20010;
int g[N], f[N];
int q[N];
int n, m;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int v, w, s;
cin >> v >> w >> s;
//f[]是当前dp g[]是上一次dp ,体积是索引
memcpy(g, f, sizeof f);
for (int j = 0; j < v; j++) {
int hh = 0; int tt = -1;
for (int k = j; k <= m; k += v) {
//本次的体积k 取s个物品 那么 最多需要f[k-s*v]的数据 比k-s*v小的体积 弹出队列
while (hh <= tt && k - s * v > q[hh]) hh++;
//得到f[k]的最大值
if (hh <= tt) f[k] = max(f[k], g[q[hh]] + (k - q[hh]) / v * w);
//排除无需在比较的体积v 为啥减去额外的w?
//自己做了修改 q[tt]和k在相同情况下比较决定是否弹出。 补上了两者v相差的额外w
while (hh <= tt && g[q[tt]] + (k- q[tt] ) / v * w < g[k] ) tt--;
q[++tt] = k;
}
}
}
cout << f[m] << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2023-06-13 papamelon 245. 征募 Conscription(挑战程序设计竞赛)
2020-06-13 Leetcode 070 爬楼梯 动态规划
2018-06-13 20180613更新 leetcode刷题