• 数据结构和算法学习之动态规划解决背包问题


    1. package com.atguigu.dynamic;
    2. import java.util.concurrent.ForkJoinPool;
    3. /**
    4. * @author
    5. * @create 2022-08-15-13:16
    6. */
    7. public class KnapsackProblem {
    8. public static void main(String[] args) {
    9. int[] w = {1, 4, 3};//物品重量
    10. int[] val = {1500, 3000, 2000};//物品的价值 这里的val[i]就是前面讲过的v[i]
    11. int m = 4;//背包的容量
    12. int n = val.length;//物品的个数
    13. //创建二位数组
    14. //v[i][j]表示在前i个物品中装入容量为j的背包中的最大价值
    15. int[][] v = new int[n + 1][m + 1];
    16. //为了记录放入商品的情况,定义一个二维数组
    17. int[][] path = new int[n + 1][m + 1];
    18. //初始化第一行和第一列,可以不处理
    19. for (int i = 0; i < v.length; i++) {
    20. v[i][0] = 0;//将第一列设置为0
    21. }
    22. for (int i = 0; i < v[0].length; i++) {
    23. v[0][i] = 0;//将第一行设置为0
    24. }
    25. //根据前面得到的公式进行动态规划处理
    26. for (int i = 1; i < v.length; i++) {//不处理第一行
    27. for (int j = 1; j < v[0].length; j++) {//不处理第一列
    28. //公式
    29. if (w[i - 1] > j) {//因为程序i是从1开始的,因此原来公式中的w[i]修改成w[i-1]
    30. v[i][j] = v[i - 1][j];
    31. } else {
    32. //因为i是从1开始的,因此公式需要调整成下面
    33. //v[i][j]=Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);
    34. //为了记录商品放入到背包中的路径,不能简单使用上述公式,需要使用if-else来代替
    35. if (v[i - 1][j] < (val[i - 1] + v[i - 1][j - w[i - 1]])) {
    36. v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
    37. //把当前情况记录下来
    38. path[i][j] = 1;
    39. } else {
    40. v[i][j] = v[i - 1][j];
    41. }
    42. }
    43. }
    44. }
    45. //输出一下v
    46. for (int i = 0; i < v.length; i++) {
    47. for (int j = 0; j < v[i].length; j++) {
    48. System.out.print(v[i][j] + " ");
    49. }
    50. System.out.println();
    51. }
    52. System.out.println("=========================");
    53. //遍历path数组
    54. for (int i = 0; i < path.length; i++) {
    55. for (int j = 0; j < path[i].length; j++) {
    56. System.out.print(path[i][j] + " ");
    57. }
    58. System.out.println();
    59. }
    60. System.out.println("========================");
    61. //遍历path数组的话会出现冗余的情况
    62. int i = path.length - 1;//最大的行下标
    63. int j = path[0].length - 1;//最大的列下标 同时表示背包中剩余的容量
    64. while (i > 0 && j > 0) {//从path的最后开始找
    65. if (path[i][j] == 1) {
    66. System.out.printf("第%d个商品放入背包\n", i);
    67. j -= w[i - 1];//w[i-1]是因为这里的i j 在path中的位置是从1开始的,而在w数组中是从0开始的
    68. }
    69. i--;
    70. }
    71. }
    72. }

  • 相关阅读:
    pikachu靶场搭建及通关
    UE4 TCP通信 (UE客户端与网络调试助手服务端、python服务端通信)
    OLOv9与YOLOv8性能差别详解
    基于JAVA文件发布系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    JDBC在IDEA中配置mysql过程及编程详解
    Oauth2系列4:密码模式
    【MC 网易-我的世界-mod开发基础笔记】 --- 创建第一个空白Mod
    职业技能鉴定服务中心前端静态页面(官网+证书查询)
    http和https包解析
    8章:scrapy框架
  • 原文地址:https://blog.csdn.net/m0_55895641/article/details/126345609