【动态规划之完全背包问题】完全背包问题的通用解法与优化

本文深入探讨动态规划中的完全背包问题,从基础的朴素解法出发,逐步讲解如何通过滚动数组和一维数组优化空间复杂度,最终达到时间复杂度O(n*c)和空间复杂度O(c)的解决方案。内容包括状态转移方程的推导及代码实现,适合对算法和动态规划感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⭐️前面的话⭐️

本篇文章将介绍动态规划中的背包问题——完全背包问题,前面我们已经介绍了0-1背包问题,其实完全背包问题就只改了0-1背包问题的一个条件,即物品可选择次数由一次改为无数次,仅此而已,下面我们就来开始介绍完全背包问题。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆首发时间:🌴2022年10月22日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!



封面区


⭐️【问题导入】完全背包原题⭐️

🔐题目详情

N N N 种物品和一个容量为 C C C 的背包,每种物品都有无限件

i i i 件物品的体积是 v [ i ] v[i] v[i] ,价值是 w [ i ] w[i] w[i]

求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

其实就是在 0-1 背包问题的基础上,增加了每件物品可以选择多次的特点(在容量允许的情况下)。

示例 :

输入: N = 2, C = 5, v = [1,2], w = [1,2]
输出: 5
解释: 选一件物品 1,再选两件物品 2,可使价值最大。

💡解题思路与代码

🍭朴素解法

我们可以直接将0-1背包的状态定义直接拿来使用:

状态定义: 不妨定义 f [ i ] [ j ] f[i][j] f[i][j]表示从前 i i i件物品中选择,容量不超过 j j j的最大价值。

确定初始状态: 当只有一种物品选择时,由于数量是无限的,所以尽量地选就行,不要超过容量 j j j,不妨设选这一种物品的最大件数为 k k k,则有 f [ 0 ] [ j ] = k × w [ i ] , 其中 k × v [ i ] < = j f[0][j]=k \times w[i],其中k\times v[i]<=j f[0][j]=k×w[i],其中k×v[i]<=j

状态转移方程推导: 当我们选择第 i i i件物品的时候,我们可以选择 0 , 1 , 2... k 0,1,2...k 0,1,2...k件,其中 k k k是最大能够选择的件数,即在不超过容量 j j j的情况下。

当我们不选择第 i i i件物品时,即 k = 0 k=0 k=0 f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j]=f[i-1][j] f[i][j]=f[i1][j]
当我们选择 1 1 1 i i i件物品时,即 k = 1 k=1 k=1 f [ i ] [ j ] = f [ i − 1 ] [ j − v [ i ] ] + w [ i ] f[i][j]=f[i-1][j - v[i]] + w[i] f[i][j]=f[i1][jv[i]]+w[i]
当我们选择 2 2 2 i i i件物品时,即 k = 2 k=2 k=2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值