import java.util.*;
// b站视频讲解地址:
// https://www.bilibili.com/video/BV1K4411X766/?spm_id_from=333.337.search-card.all.click&vd_source=46ab2667c40e3a397d8db3c4f6ceacf9
public class Solution {
public int knapsack (int V, int n, int[][] vw) {
// 初始化
int[][] dp = new int[n+1][V+1];
// 将矩阵第一行和第一列填充为0,但默认值已为0,故略
// vw[i-1]: 当前行的物品信息
// vw[i-1][0]: 物品体积 vw[i-1][1]: 物品重量
// 动态规划填充矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= V; j++) {
// 容量不足时
if (j < vw[i-1][0]) {
dp[i][j] = dp[i-1][j];
} else {
// 能装,但装不装看情况
// 不装则dp[i][j] = dp[i-1][j]
// 装则dp[i][j] = dp[i-1][j-vw[i-1][0]]+vw[i-1][1]
dp[i][j] = Math.max(
dp[i][j] = dp[i-1][j],
dp[i-1][j-vw[i-1][0]]+vw[i-1][1]
);
}
}
} // 动态规划结束
// 返回结果
return dp[n][V];
}
}