多重背包问题:

给定一个有一定容量的背包,和n个物品,每个物品有si件。

每个物品有其对应的体积和价值。

问背包最多能装下的物品的最大价值为多少。

输入格式:

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

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

输出格式:

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

思路:

每件物品的数量是有限的,并且各不相同。我们并不能和完全背包问题一样优化。

如果数据范围比较小,那我们在01背包的基础上加上第三重循环(枚举选几件该物品)。所以可以将01背包当做特殊的多重背包来处理。

代码如下:

//一维
#include<iostream>
using namespace std;const int N = 110;
int f[N][N];
int n, m;//n件物品,容量是mint main() {cin >> n >> m;int v, w, s;for (int i = 1; i <= n; i++) {cin >> v >> w >> s;for (int j = 0; j <= m; j++) {f[i][j] = f[i - 1][j];//不选for (int k = 0; k <= s; k++)//选k件if (k * v <= j)f[i][j] = max(f[i][j], f[i - 1][j - k * v] + k * w);}}cout << f[n][m];return 0;
}//一维
#include<iostream>
using namespace std;const int N = 110;
int f[N];
int n, m;//n件物品,容量是mint main() {cin >> n >> m;int v, w, s;for (int i = 1; i <= n; i++) {cin >> v >> w >> s;for (int j = m; j >= v; j--) {for (int k = 0; k <= s; k++)//选k件if (k * v <= j)f[j] = max(f[j], f[j - k * v] + k * w);}}cout << f[m];return 0;
}

二进制优化: 

​​​​​​​
我们将每一类物品打包成2^0、2^1、2^2...这样的logn堆物品。将这些物品进行组合就可以组合出1~n内的任何数量的该物品。也就是将所有分好的堆进行01背包处理就可以枚举出所有情况。那么我们就将枚举选几个物品的O(n)复杂度优化成了枚举logn个物品的O(logn)复杂度。

代码如下:

#include<iostream>
using namespace std;const int N = 2010;
int f[N];
int w[N * N], v[N * N], cnt = 0;//最多1000*logn堆物品
int n, V;int main() {cin >> n >> V;int v1, w1, s;for (int i = 0; i < n; i++) {//打包cin >> v1 >> w1 >> s;int k = 1;while (s) {if (s >= k) {v[cnt] = k * v1;w[cnt++] = k * w1;s -= k;}else {v[cnt] = s * v1;w[cnt++] = s * w1;s = 0;}k *= 2;}}for (int i = 0; i <= cnt; i++)//01背包for (int j = V; j >= v[i]; j--)f[j] = max(f[j], f[j - v[i]] + w[i]);cout << f[V];return 0;
}

例题:

庆功会:

为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。

期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。

每个物品都有价格、价值和数量三个参数。

求最大价值是多少。

输入格式:

第一行二个数n,m,其中n代表希望购买的奖品的种数,m表示拨款金额。

接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值和能购买的最大数量。

思路:

多重背包裸题,默写多重背包模板即可。

代码如下:

#include<iostream>
using namespace std;const int N = 6010;
int v[N], w[N], cnt = 0;
int f[N];
int n, V;int main() {cin >> n >> V;int v1, w1, s;for (int i = 0; i < n; i++) {cin >> v1 >> w1 >> s;int k = 1;while (s) {if (s >= k) {v[cnt] = k * v1;w[cnt++] = k * w1;s -= k;}else {v[cnt] = s * v1;w[cnt++] = s * w1;s = 0;}k *= 2;}}for (int i = 0; i < cnt; i++)for (int j = V; j >= v[i]; j--)f[j] = max(f[j], f[j - v[i]] + w[i]);cout << f[V];return 0;
}

动态规划——多重背包问题相关推荐

  1. 动态规划 多重背包问题

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

  2. 九十、动态规划系列背包问题之多重背包

    @Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...

  3. 动态规划解二维多重背包问题

    背包问题 背包问题是一个很经典的算法问题,根据其复杂程度不同又可分为01背包问题.完全背包问题.多重背包问题.二维背包问题等等.本文讲一讲二维多重背包问题的动态规划解法. 01背包问题 有N件物品和一 ...

  4. java多重背包算法,【动态规划】多重背包问题

    说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...

  5. 动态规划之背包问题---01背包---完全背包---多重背包

    本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...

  6. 背包问题(01背包问题,多重背包问题,完全背包问题)——基于python的动态规划

    1. 0-1背包问题 1.1 题目描述 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少 ...

  7. python多重背包_【动态规划】多重背包问题

    说明 前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题--多重背包. 这个背包,听起来就很麻烦的样子.别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟. 如果没有看过前两篇0 ...

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

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

  9. python多重背包_多重背包问题(python实现),动态规划

    多重背包问题 感谢这些朋友们的文章,给了我很大启发: https://blog.csdn.net/songyunli1111/article/details/94778914 https://blog ...

最新文章

  1. 用 Hystrix 构建高可用服务架构
  2. 一蹴而就的解释是什么_聪明的孩子喜欢问“为什么”,还是喜欢问“为什么”让孩子聪明?...
  3. python是一种语言还是一个软件-Python还是一种
  4. java中后端拼接字符串返回前台页面换行显示
  5. Spring Aop----用idea实现面向切面编程
  6. python gpu加速 显卡_PyTorch-GPU加速实例
  7. python参数是什么_最全Python快速入门教程,满满都是干货
  8. Spark基本操作SparkSession,DatasetRow,JavaRDDRow
  9. Java单元测试技巧之PowerMock
  10. GNS3模拟器中关于创建vtp时,内存空间不足问题的解决
  11. oracle goldengate实施简明介绍
  12. 开发常见错误之 :Missing artifact com.sun:tools:jar 1.7.0
  13. 如何在javascript中解析带有两个小数位的浮点数?
  14. Spine 动画工具
  15. oracle数据库导dump,oracle数据导入,导出dump文件
  16. 计算机组成原理(第三版)唐朔飞-课后习题(完整版)
  17. 如何去做一个完整的网站SEO优化方案!
  18. My97DatePicker时间控件在asp.net的应用
  19. KT6368A蓝牙转HID键盘_蓝牙ibeacon模块方案测试板使用说明
  20. redission限流RedisException问题排查

热门文章

  1. PHP+SQL考勤系统安全性的设计与实现
  2. github开源企业级应用框架介绍CIIP
  3. 设计抗混叠滤波器的三个指导原则--日记
  4. visualSVN server的安装和使用
  5. kakfa如何查询指定消费组lag
  6. mysql数据库事务四大特性的实现原理
  7. 使用bins对数据进行分段并计算每个分段的数据量
  8. Mysql 分库分表 Mycat
  9. Hu矩的形状特征提取---matlab实现
  10. a标签和阻止事件冒泡