动态规划(7)-01背包
01背包
https://www.nowcoder.com/practice/2820ea076d144b30806e72de5e5d4bbf?tpId=188&tqId=38312&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fjob-code-high-week%2Fquestion-ranking&tab=answerKey
题目描述
已知一个背包最多能容纳物体的体积为V
现有n个物品第i个物品的体积为v_i,第i个物品的重量为w_iw
求当前背包最多能装多大重量的物品
示例1
输入
10,2,[[1,3],[10,4]]
返回值
4
说明
第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4
思路
- 递推如下:
- 包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j)
- 还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
code
import java.util.*; public class Solution { public int knapsack (int V, int n, int[][] vw) { int dp[][] = new int[n+1][V+1]; for(int i=1;i<=n;i++) for(int j=1;j<=V;j++){ int v=vw[i-1][0],w=vw[i-1][1]; if(j<v) dp[i][j]=dp[i-1][j]; else dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-v]+w); } return dp[n][V]; } }