混合背包

1|0混合背包

1|1题目描述

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

  • 第一类物品只能用1次(01背包);
  • 第二类物品可以用无限次(完全背包);
  • 第三类物品最多只能用si次(多重背包);

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

1|2输入格式

第一行两个整数,N,V表示物品种数和背包容积。

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

  • si=1表示第i种物品只能用1次;
  • si=0表示第i种物品可以用无限次;
  • si>0表示第i种物品可以使用si次;

1|3数据范围

0<N,V10000<vi,wi10001si1000

1|4思路和代码1

混合背包就是将前面三种的背包问题混合起来,有的只能取一次,有的能取无限次,有的只能取k次。

先将01背包和完全背包转化成多重背包。

  • 01背包,物品数量为1的多重背包,
  • 完全背包,物品数量为V/vi的多重背包,虽然物品数量是无限的,但是背包容量是有限的。

再按照多重背包来做即可。

#include <bits/stdc++.h> using namespace std; const int N = 1005 * 20; int f[N], w[N], v[N], n, m; int main() { int cnt = 0; cin >> n >> m; for (int i = 1; i <= n; i ++) { int a, b, s; cin >> a >> b >> s; if (s == 0) s = m / a;//如果是完全背包,则看成多重背包做 if (s == -1)//01背包 { cnt ++; v[cnt] = a, w[cnt] = b; } else//多重背包二进制拆分 { int k = 1; while (k <= s) { cnt ++; v[cnt] = k * a; w[cnt] = k * b; s -= k; k *= 2; } if (s) { cnt ++; v[cnt] = s * a; w[cnt] = s * b; } } } for (int i = 1; i <= cnt; i ++) for (int j = m; j >= v[i]; j --) f[j] = max(f[j], f[j - v[i]] + w[i]); cout << f[m]; return 0; }

1|5思路和代码2

01背包当成数量为1的多重背包,然后进行二进制优化。

完全背包的求法与01背包不同,所以单独算完全背包部分。

#include <bits/stdc++.h> using namespace std; const int N = 1010; int n, m; int f[N]; int main() { cin >> n >> m; for (int i = 0; i < n; i ++) { int v, w, s; cin >> v >> w >> s; if (!s)//完全背包 { for (int j = v; j <= m; j ++) f[j] = max(f[j], f[j - v] + w); } else { if (s == -1) s = 1;//01背包当成数量为1的多重背包 for (int k = 1; k <= s; k *= 2) { for (int j = m; j >= k * v; j --) f[j] = max(f[j], f[j - k * v] + k * w); s -= k; } if (s) { for (int j = m; j >= s * v; j --) f[j] = max(f[j], f[j - s * v] + s * w); } } } cout << f[m] << endl; return 0; }

1|6模板题

洛谷P1833 樱花


__EOF__

本文作者可爱的卤蛋
本文链接https://www.cnblogs.com/acwhr/p/17853446.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   可爱的卤蛋  阅读(36)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示