class Solution {
public int knapsack(int W, int N, int[] wt, int[] val) {
// base case; 状态:背包容量、可选择的物品; 选择:装进背包,不装进背包
// dp[i][j] 背包容量为j时,从第1到i件物品中做选择,所能获取的最大价值
int[][] dp = new int[N + 1][W + 1];
for (int i = 1; i < N + 1; i++) { // 状态:从第1件物品到第N件物品
for (int j = 1; j < W + 1; j++) { // 状态:背包容量从1到W
if (j - wt[i - 1] < 0) { // 这种情况下只能选择不装入背包
dp[i][j] = dp[i - 1][j];
} else {
// 选择: 把第i件物品放入背包,或者不放入背包
dp[i][j] = Math.max(dp[i - 1][j - wt[i - 1]] + val[i - 1],
dp[i - 1][j]);
}
}
}
return dp[N][W];
}
}