@Author:Runsen

曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留。大学的玩命学习,一转眼,就大四了,一不小心就成了学校最老的学长!

前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题——多重背包。

题目是这样的:来源:https://www.acwing.com/problem/content/4/

有 NNN 种物品和一个容量是VVV 的背包。

第 iii 种物品最多有 sisisi件,每件体积是ViViVi,价值是 wiwiwi。

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

输入格式
第一行两个整数,NNN,VVV,用空格隔开,分别表示物品种数和背包容积。

接下来有 NNN 行,每行三个整数 ViViVi,wiwiwi,sisisi,用空格隔开,分别表示第 iii 种物品的体积、价值和数量。

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

输入样例
4 5
1 2 3 # 体积、价值和数量
2 4 1
3 4 3
4 5 2
输出样例:
10

状态表示:dp[j]

  1. 集合:当前价值j的最大值
  2. 属性:最大值

多重背包问题的思路跟完全背包的思路非常类似,只是取值是有限制的,因为每件物品的数量是有限制的,状态转移方程为:dp [j] = max(dp [j], dp [j - k*b] + k*w) 这里的b和w指的是当前遍历的体积和价值。

这里一维动态规划和01背包基一样,就是多了一个k的循环,具体的查看下面代码。

n, v = map(int, input().split())dp = [0 for _ in range(v+1)]for i in range(n):b, w, s = map(int, input().split())for j in range(v, -1, -1):k = 1while k <= s and j >= k * b:dp [j] = max(dp [j], dp [j - k*b] + k*w)k += 1
print(dp[v])

除了上面的方法,还有用最原始的方法,将多个同一物品转化成不同物品,再用01背包求解

n,v = map(int, input().split())
goods = []
for i in range(n):goods.append([int(i) for i in input().split()])new_goods = []for i in range(n):for j in range(goods[i][2]):new_goods.append(goods[i][0:2])goods = new_goods
n = len(goods)dp = [0 for i in range(v+1)]for i in range(n):# 01背包倒序for j in range(v,-1,-1):if j>= goods[i][0]:dp[j] = max(dp[j], dp[j - goods[i][0]] + goods[i][1])
print(dp[-1])

关于多重背包问题中的二进制解法,Runsen下一篇再写。如今就是体现自己的实力的时候了。Leetcode刷起来。

Leetcode 面试题 17.16. 按摩师

`一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

注意:本题相对原题稍作改动

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。

题目,其实就是不连续最大子序列。

每个预约都可以选择接或不接来做出思考,每次都有两种选择,那么就是状态转移方程:
dp[k]=max(dp[k−1],nums[k]+dp[k−2])dp[k] = max(dp[k - 1], nums[k ] + dp[k - 2])dp[k]=max(dp[k−1],nums[k]+dp[k−2])

class Solution:def massage(self, nums: List[int]) -> int:if len(nums) == 0:return 0# 求最值用0 dp = [0] * (len(nums))dp[0] = nums[0]for k in range(1,len(nums)):dp[k] = max(dp[k - 1], nums[k] + dp[k - 2])return dp[-1]

Leetcode 面试题 08.11. 硬币

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)

示例1:

输入: n = 5
输出:2
解释: 有两种方式可以凑成总金额:
5=5
5=1+1+1+1+1
示例2:

输入: n = 10
输出:4
解释: 有四种方式可以凑成总金额:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1

class Solution:def waysToChange(self, n: int) -> int:# 不就是一个零钱对换问题 的完全背包问题? 这里需要将结果模上 10**9 + 7# 求最大值dp = [0] * (n+1)# f(11) = min(f(10),f(9),f(6)) + 1dp[0] = 1for i in [1,5,25,10]:for j in range(i, n + 1):dp[j] += dp[j - i]return dp[-1] % 1000000007

九十、动态规划系列背包问题之多重背包相关推荐

  1. 九十一、动态规划系列 背包问题之混合背包

    @Author:Runsen @Date:2020/09/27 背包系列,是动态规划里一类典型的问题,主要有:01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,有依赖背包和泛化物品等.也 ...

  2. 八十九、动态规划系列背包问题之完全背包

    @Author:Runsen @Date:2020/9/15 动态规划需要搞定三个系列:三个背包,零钱问题和股票问题.今天就开始干掉三个背包问题. 三个背包问题:01背包,多重背包,完全背包.上次搞定 ...

  3. 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)

    @Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...

  4. 动态规划 —— 背包问题 P03 —— 多重背包

    [题目] 有 N 种物品和一个容量为 V 的背包.第 i 种物品最多有 num[i] 件可用,每件体积是 w[i],价值是 c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值 ...

  5. 动态规划背包问题之多重背包详解

    背包问题前几篇文章: 01背包详解 完全背包详解 文章目录 一.什么是多重背包问题? 二.例题分析 1. 题目: 2.第一种:朴素做法 3.第二种:二进制优化 4.第二种:单调队列优化<待写&g ...

  6. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  7. 背包问题之多重背包基础写法

    #多重背包问题 多重背包其实可以看做01背包问题的变形,某种物品有规定可取次数,我们可以看多有多个这种相同的物品,然后进行01背包求解. 看一个例题: 悼念512汶川大地震遇难同胞--珍惜现在,感恩生 ...

  8. ACM算法笔记(八)背包问题_多重背包

    问题描述: 现在给你一个容量为V的背包,有N个物品,其中第i件物品的重量为wi,价值为vi,第i件物品一共有si件,问在有限的容量内,最多可以拿到多少价值的物品. 题目分析: 仔细一看,多重背包问题和 ...

  9. Python3使用动态规划处理背包问题:完全背包(含背包恰好装满的情况)

    文章目录 题目介绍 题解1 题解2 题解3 完全背包问题是基于01背包的,如果对01背包问题不熟悉,可以参考: Python3使用动态规划处理01背包问题 题目介绍 原题链接:NC309 完全背包 描 ...

最新文章

  1. Centos7 安装 docker-ce
  2. c语言设计期末考试试题及答案,C语言程序的设计期末考试试题(含答案).pdf
  3. win环境下安装python之matplotlib经历
  4. hive 自定义元数据表_Hive分区表和桶表的使用
  5. noip2017考前整理(未完)
  6. 分类测试以减少构建时间
  7. 智能支付稳定性测试实战
  8. 信息学奥赛一本通(1014:与圆相关的计算)
  9. Git建立远程代码仓库和本地代码仓库
  10. y7000p内存是一个16还是8+8_现货黄金创8年新高!黄金ETF年内净值增逾16%,买入还是离场?...
  11. Python之网络编程(粘包、粘包解决方案)
  12. AngularJs学习的前景及优势
  13. 谈谈 Linux 假死现象
  14. 海思Hi3519AV100sensor移植之一-- imx307
  15. 思科防火墙基本配置思路及命令
  16. sqlserver:什么是数据库实例?
  17. 【英语语法入门】 第23讲 动词的用法
  18. usb接口驱动_教你如何下载安装打印机驱动并设置共享打印机
  19. 计算机考在职研究生有用吗,报考计算机在职研究生有用吗?
  20. 微服务架构开发实战:什么是微服务的熔断机制和熔断的意义

热门文章

  1. ESP32-S3芯片与ESP32及ESP32-S2比较好在哪里呢?官方到目前还没有任何信息发布,我们先来猜看都会有哪些性能的提升
  2. LIN总线接口静电保护专用器件:DW24DLC-B-S和DW24D-B-S
  3. Ubuntu下搭建Kubernetes集群(3)--k8s部署
  4. npm 与 package.json 快速入门
  5. MyEclipse完好提示配置
  6. sicily vector有序插入
  7. HashTable类模板_C++
  8. java虚拟机调用linux_Java虚拟机字节码执行引擎
  9. 2给我背书_让优秀的人做你的背书人
  10. android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...