题解 | #01背包#
01背包
https://www.nowcoder.com/practice/2820ea076d144b30806e72de5e5d4bbf
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算01背包问题的结果 * @param V int整型 背包的体积 * @param n int整型 物品的个数 * @param vw int整型二维数组 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi * @return int整型 */ public int knapsack (int V, int n, int[][] vw) { // write code here int[][] dp = new int[n+1][V+1]; //dp[i][j]:对于前i个物品,背包容量为j时,能装载的最大价值 //例子:dp[3][5]=6:对于前3个物品,背包容量为5时,能装载的最大价值为6 //dp[0][...]=0;dp[...][0]=0 for(int i=1;i<=n;i++)//循环n个物品 { for(int j=1;j<=V;j++)//循环背包容量 { if(j<vw[i-1][0])//第i个物品装不下 { dp[i][j]=dp[i-1][j]; } else//第i个物品能装下 //不装:dp[i][j]=dp[i-1][j]; //装:dp[i][j]=dp[i-1][j-vw[i-1][0]]+vw[i-1][1],因为你选择了要装第i个物品,所以肯定要加第i个物品的价值vw[i-1][1],相当于你把前i-1个物品,撞到了容量为j-vw[i-1][0]的背包里 { dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-vw[i-1][0]]+vw[i-1][1]); } } } return dp[n][V];//前n个物品,背包容量为V } }