image.png
    image.png
    image.png
    image.pngimage.png
    image.png

    image.png

    1. package com.atguigu.dynamic;
    2. import java.util.Arrays;
    3. /**
    4. * 动态规划 --- 背包问题
    5. *
    6. * @author Dxkstart
    7. * @create 2022-04-12-16:13
    8. */
    9. public class KnapsackProblem {
    10. public static void main(String[] args) {
    11. // 物品的重量
    12. int[] w = {1,4,3};
    13. // 物品的价值
    14. int[] v = {1500,3000,2000};
    15. // 背包容量
    16. int m = 4;
    17. // 物品的总数
    18. int n = v.length;
    19. // 一个二维数组表
    20. int[][] arr = new int[n+1][m+1];
    21. // 初始化第一行第一列,都为0
    22. for (int i = 0; i < m + 1; i++) {
    23. arr[0][i] = 0;
    24. }
    25. for (int i = 0; i < n + 1; i++) {
    26. arr[i][0] = 0;
    27. }
    28. // 根据公式进行动态规划处理
    29. for (int i = 1; i < n + 1; i++) {
    30. for (int j = 1; j < m + 1; j++) {
    31. // 物品的重量 > 此时的背包容量 => 同一列的上一个格子的值
    32. // 公式:arr[i][j] = arr[i-1][j]
    33. if (w[i-1] > j) {
    34. arr[i][j] = arr[i-1][j];
    35. }
    36. // 此时的背包容量 >= 物品的重量
    37. // 公式: arr[i][j] = max{ arr[i-1][j], v[i-1] + arr[i-1][j-w[i-1]] }
    38. if (j >= w[i-1]) {
    39. // 同一列的上一格
    40. int a = arr[i-1][j];
    41. int b = v[i-1] + arr[i-1][j-w[i-1]];
    42. arr[i][j] = a > b ? a : b;
    43. }
    44. }
    45. }
    46. // 输出矩阵
    47. for (int[] in: arr) {
    48. System.err.println(Arrays.toString(in));
    49. }
    50. }
    51. }