01背包问题

本文详细解析了0-1背包问题的动态规划解决方案,通过示例展示了如何创建价值与重量数组,计算最大价值并追踪路径。核心部分是利用knapsackValue数组记录每种情况下的最大价值,涉及物品选择与容量优化。
摘要由CSDN通过智能技术生成
public class MyTest2 {
    public static void main(String[] args) {
        //创建物品的价值跟重量的数组
        int v[] = new int[]{0, 1500, 3000, 2000};
        int w[] = new int[]{0, 1, 4, 3};


        int n = v.length;//设置物品的数量
        int m = 5;//这里需要去查找物品重量最大值+1


        //一般都会多放入一个物品是0的就是代表没有物品可以放入,
        //容量也一样是从0开始,代表不能放入任何东西
        //创建最佳存放物品的价值,4代表物品的种类,如果是0就只能放入0号物品,如果
        // 是1就可以放入1号物品.
        // 5表示物品重量的最大值+1 因为是从0到4 所以有5个列
        int[][] knapsackValue = new int[n][m];

        //
        int[][] path = new int[n][m];

        /*
        这两句是这个算法的核心
        knapsackValue[i][j]=knapsackValue[i-1][j]
        如果这次物品不能放入,这时的价值就应该是上一个物品对于的容量的价值
        Math.max(knapsackValue[i-1][j],v[i]+knapsackValue[i-1][j-w[i]]);
        如果物品能够放入那么应该比较将上一个物品对于容量的价值与这次物品的价值,加他剩余的容量所能、
        放入的价值。
        这里面存放的值都是最大的价值
        如果还不能懂就自己动手画图。
        */
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (w[i] > j) {
                    knapsackValue[i][j] = knapsackValue[i - 1][j];
                } else if (w[i] <= j) {
//                    int value=Math.max(knapsackValue[i-1][j],v[i]+knapsackValue[i-1][j-w[i]]);
//                    knapsackValue[i][j]=value;
//                    path[i][j]=1;
                    if (knapsackValue[i - 1][j] >= v[i] + knapsackValue[i - 1][j - w[i]]) {
                        int value=knapsackValue[i-1][j];
                        knapsackValue[i][j]=value;
                    } else {
                        int value= v[i] + knapsackValue[i - 1][j - w[i]];
                        knapsackValue[i][j]=value;
                        path[i][j]=1;
                    }
                }
            }
        }

        //输出结果
        for (int[] ints : knapsackValue) {
            for (int anInt : ints) {
//                System.out.print(anInt+"\t\t");
//                System.out.printf("%-4d",anInt); //向左对齐,不够补零
                System.out.printf("%04d", anInt);   //输出的值的位数为4位,不够补0
                System.out.printf("\t");  // 转义字符 制表符
            }
            System.out.println();//换行
        }

        //
//        for (int[] ints : path) {
//            for (int anInt : ints) {
//                System.out.printf("%04d",anInt);
//                System.out.printf("\t");
//            }
//            System.out.println();
//        }

        int i=n-1;//最后一个物品      为3
        int j=m-1;//重量的最大值为m-1 为4
        //循环,以i>0为结束,主要是物品不为0
        System.out.println("最大价值背包内存放的物品为:");
        while(i>0){
            if(path[i][j]==1){
                System.out.println("物品"+i+"放入背包");
                j-=w[i];
            }else{
                i--;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值