0- 问题描述
背包可装载容量为W,现有N个物品,第 i 个物品的重量和价值分别为wt[ i ]和val[ i ]。求不超过装载容量下,背包所装物品的最大价值。
1- 动态规划思路
排序等方法对此没有用,必须要穷举所有的可能。这时候用动态规划可以提高效率。首先明确动态规划的三要素:状态、选择、dp数组的含义。
(1)状态:①背包的容量;②可选择物品
(2)选择:①装该物品;②不装该物品
(3)dp数组含义
有两个状态,故dp数组为二维dp[][], dp[i][j]表示背包容量为 i 下,可选择前 j 个物品的最大背包价值。需要求解的即dp[w][N]。
2- 代码
class Solution {
public int baggage(int w, int[] val, int[] wt){
//定义dp[i][j]表示背包重量为i下,装前j个物品的最大价值
int n = val.length;
int[][] dp = new int[w+1][n+1];
//base case
//dp[][0]和dp[0][]都是0
//dp数组
for(int i = 1; i <= w; i++){
for(int j = 1; j < n; j++){
//做选择的时机:当 当前容量大于该物品质量
if(i > wt[j-1]){
//选择或者不选择该物品
dp[i][j] = Math.max(dp[i][j-1],//不选择该物品,容量不变,在前j-1个物品中选
dp[i - wt(j-1)][j-1] + val[j-1]);//选择该物品,其余的i - w[j]质量选择前j-1个物品
//不用担心w-wt(i)<小于0时会越界,因为有i > wt[j-1]
}
else{//否则,只能不选
dp[i][j] = dp[i][j-1];
}
}
return dp[w][n];
}
}