题解 | #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[] weight=new int[n]; int[] value=new int[n]; for(int i=0;i<n;i++){ weight[i]=vw[i][0]; value[i]=vw[i][1]; } return process(weight,value,n,V); } int[][] memo ; int[] weight; int[] value; int n; public int process(int[] weight, int[] value, int n, int bagWeight) { memo= new int[n][bagWeight + 1]; for(int i=0;i<n;i++){ Arrays.fill(memo[i],-1); } this.weight=weight; this.value=value; this.n=n; return process(0,bagWeight); } // 来到物品index这里,装还是不装,bagAvl表示背包剩余体积,gv表示已经获取的价值 public int process(int index, int bagAvl) { if (bagAvl == 0 || index == n) { // 背包已经装满 或者 已经对所有物品都进行了选择 return 0; } if (memo[index][bagAvl] != -1) { return memo[index][bagAvl]; } // 不装 int p1 = process(index + 1,bagAvl); // 装 int p2 = 0; if (bagAvl >= weight[index]) { p2 = process(index + 1,bagAvl-weight[index])+value[index]; } memo[index][bagAvl] = Math.max(p1, p2); return memo[index][bagAvl]; // return Math.max(p1, p2); } }