使用stream().filter():根據兩個物件的屬性來判斷是否重複
阿新 • • 發佈:2022-05-07
/** * 揹包問題 * 有n件物品和一個最大承重為W的揹包,每件物品的重量是w[i],價值是v[i], * 在保證總重量不超過 W 的前提下,選擇某些物品裝入揹包,揹包的最大總價值是多少? * 注意:每個物品只有一件,也就是每個物品只能選擇 0 件或者 1 件 */ public class Bag { public static int maxValue(int[] values, int[] weights, int max) { if (values == null || values.length == 0) { return 0; } if (weights == null || weights.length == 0) { return 0; } if (max <= 0) { return 0; } int dp[][] = new int[values.length + 1][max + 1]; for (int i = 1; i <= values.length; i++) { for (int j = 1; j <= max; j++) { // 選中的物品重量 int selectWeight = weights[i - 1]; // 如果選擇的物品的重量超過最大承重 if (selectWeight > j) { // 最大的價值 = 上一輪的最大價值(不選擇該物品) dp[i][j] = dp[i - 1][j]; } else { // 選擇該物品 dp[i][j] = Math.max(dp[i - 1][j], values[i - 1] + dp[i - 1][weights[i - 1]]); } } } return dp[values.length][max]; } public static void main(String[] args) { int[] values = {6, 3, 5, 4, 6}; int[] weights = {2, 2, 6, 5, 4}; int max = 10; System.out.println(maxValue(values, weights, max)); } }