前面的话
本篇文章将介绍算法专题之动态规划中的背包问题,更准确的说是背包问题中最简单的一种类型,即0-1背包问题,就是给你一定容量的背包和若干物品,每种物品只能选一次,告诉你每件物品的价值和体积,求背包里面物品的最大总价值。
??博客主页:的博客主页
??欢迎关注??点赞??收藏留言??
??本文由原创,CSDN首发!
??首发时间:??2022年5月8日??
坚持和努力一定能换来诗与远方!
??推荐书籍:??《算法》,??《漫画算法》
??参考在线编程网站:??牛客网??力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
??作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
??导航小助手??
背包问题:泛指一类「给定价值与成本」,同时「限定决策规则」,在这样的条件下,如何实现价值最大化的问题。
0-1背包:「01背包」是指给定物品价值与体积(对应了「给定价值与成本」),在规定容量下(对应了「限定决策规则」)如何使得所选物品的总价值最大。 (来自宫水三叶)
0-1背包问题
??题目详情
有 N 件物品和一个容量是 V 的背包。每件物品有且只有一件。
第 i 件物品的体积是v[i] ,价值是w[i] 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
示例 1:
输入: N = 3, V = 4, v = [4,2,3], w = [4,2,3]
输出: 4
解释: 只选第一件物品,可使价值最大。
示例 2:
输入: N = 3, V = 5, v = [4,2,3], w = [4,2,3]
输出: 5
解释: 不选第一件物品,选择第二件和第三件物品,可使价值最大。
??解题思路
分析:
这道题目的意思是给你一堆物品,每种物品只有一件,然后就是在这些物品中选一部分放入背包,在不超过背包容量的情况下,求背包里面物品的最大总价值。
??朴素0-1背包通解
状态定义:
本质上就是从i
个物品中选择一定数量的物品在一定空间限制的前提下,求这些物品的最大总价值,我们可以定义一个二维数组dp[i][j]
,这个数组的值就表示从前i
件物品进行选择,在不超过容量j
的前提下所满足最大的物品总价值。(注:此处的第i
件物品对应与数组下标i
)
确定初始状态:
当只有一个物品时,如果该物品的体积v
不大于背包容量j
,则初始值dp[0][j]=v
,否则dp[0][j]=0
。
状态转移方程:
对于第i
件物品,设它的所占容量为v[i]
,价值为w[i]
,我们可以选择该物品也可以不选择该物品,如果不选择该物品则 d p [ i ] [ j ] = d p [ i 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j],如果选择该物品有两种情况:
- 背包剩余空间不够了,那么此时就无法选择该物品, d p [ i ] [ j ] = d p [ i 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j]。
- 背包剩余空间充足,那么此时的物品总价值为 d p [ i ] [ j ] = d p [ i 1 ] [ j v [ i ] ] + w [ i ] dp[i][j]=dp[i-1][j-v[i]] + w[i] dp[i][j]=dp[i1][jv[i]]+w[i]。
综上,转移方程为 d p [ i ] [ j ] = m a x ( d p [ i 1 ] [ j ] , d p [ i 1 ] [ j v [ i ] ] + w [ i ] ) dp[i][j]=max(dp[i-1][j], dp[i-1][j-v[i]]+w[i]) dp[i][j]=max(dp[i1][j],dp[i1][jv[i]]+w[i])。
实现代码:
/**
*
* @param N 物品数
* @param C 背包容量
* @param v 每件的体积
* @param w 每件物品的价值
* @retu