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]; } }