⭐️前面的话⭐️
本篇文章将介绍动态规划中的背包问题——完全背包问题,前面我们已经介绍了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[i−1][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[i−1][j−v[i]]+w[i]。
当我们选择 2 2 2第 i i i件物品时,即 k = 2 k=2 k=2