背包问题思路整理 – 自存,咋总忘呢!
0-1背包
关于0-1背包的情景设定:
有N件物品和一个容量为V的背包。放入第i件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。对于每一件物品只有一件,选择放/不放。
这道题的分析,首先根据情景,得知需要求得将哪些物品装入背包可使价值总和最大,因从,dp数组得值代表得使最大价值总和。
确认状态(变量):情境中出现得变量为N(物品数量)、V(容量)、Ci(耗费容量)、Wi(价值),那么哪些会影响最后得价值呢 ?
N影响得使决定目前终点是第几个元素,Ci会影响能否放入背包,因为总容量为V,Wi则是根据放/不放来决定是否加。
因此,dp设置为二维数组,dp[i][j]代表截至第i个元素,使用了j容量时,最大价值为dp[i][j]。
确认选择:放、不放
确认状态转移方程:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-Ci]+Wi)
for(int i = 1; i <= N; i++){
for(int c = 1; v <= V;; w++){
if(c - C[i-1] < 0){
//直接就不放入
}else{
//放入或者不放入
dp[i][c] = Math.max(dp[i-1][c-C[i-1]]+w[i-1],
dp[i-1][c]);
}
}
}