题解 | #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
return dp(vw, V);
}
public int dp(int [][] vw, int V) {
if (V < 0 || vw.length <= 0) {
return 0;
}
int [][] dp = new int[vw.length+1][V+1];
for (int i = vw.length - 1; i >= 0; i--) {//遍历物品
for (int j = 0; j <= V; j++) {
// 选第i个物品
int w1 = 0;
if (j >= vw[i][0]) {
w1 = dp[i+1][j-vw[i][0]] + vw[i][1];
}
int w2 = dp[i+1][j];
dp[i][j] = Math.max(w1,w2);
}
}
return dp[0][V];
}
public int maxW(int [][] vw, int index, int leftV) {
if (index == vw.length) {
return 0;
}
if (leftV < 0) {
return 0;
}
int w1 = 0;
if(leftV >= vw[index][0]) {
w1 = maxW(vw, index+1, leftV - vw[index][0]) + vw[index][1];//选择第index个物品
}
int w2 = maxW(vw, index+1, leftV);// 不选第index个物品
return Math.max(w1,w2);
}
}