





package com.atguigu.dynamic;import java.util.Arrays;/*** 动态规划 --- 背包问题** @author Dxkstart* @create 2022-04-12-16:13*/public class KnapsackProblem {public static void main(String[] args) {// 物品的重量int[] w = {1,4,3};// 物品的价值int[] v = {1500,3000,2000};// 背包容量int m = 4;// 物品的总数int n = v.length;// 一个二维数组表int[][] arr = new int[n+1][m+1];// 初始化第一行第一列,都为0for (int i = 0; i < m + 1; i++) {arr[0][i] = 0;}for (int i = 0; i < n + 1; i++) {arr[i][0] = 0;}// 根据公式进行动态规划处理for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; j++) {// 物品的重量 > 此时的背包容量 => 同一列的上一个格子的值// 公式:arr[i][j] = arr[i-1][j]if (w[i-1] > j) {arr[i][j] = arr[i-1][j];}// 此时的背包容量 >= 物品的重量// 公式: arr[i][j] = max{ arr[i-1][j], v[i-1] + arr[i-1][j-w[i-1]] }if (j >= w[i-1]) {// 同一列的上一格int a = arr[i-1][j];int b = v[i-1] + arr[i-1][j-w[i-1]];arr[i][j] = a > b ? a : b;}}}// 输出矩阵for (int[] in: arr) {System.err.println(Arrays.toString(in));}}}
