九十、动态规划系列背包问题之多重背包
@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]
- 集合:当前价值
j
的最大值 - 属性:最大值
多重背包问题的思路跟完全背包的思路非常类似,只是取值是有限制的,因为每件物品的数量是有限制的,状态转移方程为: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
九十、动态规划系列背包问题之多重背包相关推荐
- 九十一、动态规划系列 背包问题之混合背包
@Author:Runsen @Date:2020/09/27 背包系列,是动态规划里一类典型的问题,主要有:01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,有依赖背包和泛化物品等.也 ...
- 八十九、动态规划系列背包问题之完全背包
@Author:Runsen @Date:2020/9/15 动态规划需要搞定三个系列:三个背包,零钱问题和股票问题.今天就开始干掉三个背包问题. 三个背包问题:01背包,多重背包,完全背包.上次搞定 ...
- 为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)
@Author:Runsen @Date:2020/9/17 多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤.在多重背包的问题,其实更多的是考查多重背包的二进制优化方法.学习二进制优化 ...
- 动态规划 —— 背包问题 P03 —— 多重背包
[题目] 有 N 种物品和一个容量为 V 的背包.第 i 种物品最多有 num[i] 件可用,每件体积是 w[i],价值是 c[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值 ...
- 动态规划背包问题之多重背包详解
背包问题前几篇文章: 01背包详解 完全背包详解 文章目录 一.什么是多重背包问题? 二.例题分析 1. 题目: 2.第一种:朴素做法 3.第二种:二进制优化 4.第二种:单调队列优化<待写&g ...
- 背包问题(多重背包+0-1背包)
一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...
- 背包问题之多重背包基础写法
#多重背包问题 多重背包其实可以看做01背包问题的变形,某种物品有规定可取次数,我们可以看多有多个这种相同的物品,然后进行01背包求解. 看一个例题: 悼念512汶川大地震遇难同胞--珍惜现在,感恩生 ...
- ACM算法笔记(八)背包问题_多重背包
问题描述: 现在给你一个容量为V的背包,有N个物品,其中第i件物品的重量为wi,价值为vi,第i件物品一共有si件,问在有限的容量内,最多可以拿到多少价值的物品. 题目分析: 仔细一看,多重背包问题和 ...
- Python3使用动态规划处理背包问题:完全背包(含背包恰好装满的情况)
文章目录 题目介绍 题解1 题解2 题解3 完全背包问题是基于01背包的,如果对01背包问题不熟悉,可以参考: Python3使用动态规划处理01背包问题 题目介绍 原题链接:NC309 完全背包 描 ...
最新文章
- Centos7 安装 docker-ce
- c语言设计期末考试试题及答案,C语言程序的设计期末考试试题(含答案).pdf
- win环境下安装python之matplotlib经历
- hive 自定义元数据表_Hive分区表和桶表的使用
- noip2017考前整理(未完)
- 分类测试以减少构建时间
- 智能支付稳定性测试实战
- 信息学奥赛一本通(1014:与圆相关的计算)
- Git建立远程代码仓库和本地代码仓库
- y7000p内存是一个16还是8+8_现货黄金创8年新高!黄金ETF年内净值增逾16%,买入还是离场?...
- Python之网络编程(粘包、粘包解决方案)
- AngularJs学习的前景及优势
- 谈谈 Linux 假死现象
- 海思Hi3519AV100sensor移植之一-- imx307
- 思科防火墙基本配置思路及命令
- sqlserver:什么是数据库实例?
- 【英语语法入门】 第23讲 动词的用法
- usb接口驱动_教你如何下载安装打印机驱动并设置共享打印机
- 计算机考在职研究生有用吗,报考计算机在职研究生有用吗?
- 微服务架构开发实战:什么是微服务的熔断机制和熔断的意义
热门文章
- ESP32-S3芯片与ESP32及ESP32-S2比较好在哪里呢?官方到目前还没有任何信息发布,我们先来猜看都会有哪些性能的提升
- LIN总线接口静电保护专用器件:DW24DLC-B-S和DW24D-B-S
- Ubuntu下搭建Kubernetes集群(3)--k8s部署
- npm 与 package.json 快速入门
- MyEclipse完好提示配置
- sicily vector有序插入
- HashTable类模板_C++
- java虚拟机调用linux_Java虚拟机字节码执行引擎
- 2给我背书_让优秀的人做你的背书人
- android classloader的功能和工作模式,Android中ClassLoader和java中ClassLoader有什么关系和不同...