栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

暴力递归到动态规划 03 (背包问题)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

暴力递归到动态规划 03 (背包问题)

1. 题目

有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

2. 暴力递归

如果剩余空间<0,则返回-1
如果选完最后一个,再选就直接返回0
对于一个物品,可以选,可以不选
如果不选,curIndex+1,这个物品直接跳过
如果选,判断返回来的值是不是 -1 ,如果不是,则添加新价值

   public int getMaxValue(int[] weight, int[] value, int bagSize) {
        return getValue(weight, value, bagSize, 0);
    }

    
    private int getValue(int[] weight, int[] value, int bagFreeSpace, int curIndex) {
        //如果剩余空间<0
        if (bagFreeSpace < 0) {
            return -1;
        }
        if (curIndex == value.length) {
            //如果选完最后一个  value[value.length - 1]
            return 0;
        }
        //如果当前物品不选,则直接选下一个
        int unSelect = getValue(weight, value, bagFreeSpace, curIndex + 1);
        //如果当前物品可以选
        int select = 0;
        int next = getValue(weight, value, bagFreeSpace - weight[curIndex], curIndex + 1);
        if (next != -1) {
            select = value[curIndex] + next;
        }
        //选择最大价值
        return Math.max(unSelect, select);
    }

2. 动态规划

dp数组,横向为选择的物品,纵向为当前背包容量
由递归的返回过程可知,当选完所有物品,即 curIndex == n , 则dp[ n ] [ curIndex] = 0
由下往上递归 (第 n - 1 行开始,第 n 行全部为0),从左往右循环
如果不选,为dp[i+1][j]
如果选,value[i] + dp[i + 1][j - weight[i]]
在连两者中选最大值

 public int getMaxValue2(int[] weight, int[] value, int bagSize) {
        int n = weight.length;
        //横向为背包剩余空间
        //纵向为当前选择的物品
        int[][] dp = new int[n + 1][bagSize + 1];
        //由暴力递归可知,当curIndex==n , 则为0
        // Java 默认为0
        for (int i = 0; i <=bagSize; i++) {
            dp[n][i] = 0;
        }
        //物品
        for (int i = n-1; i >= 0; i--) {
            for (int j = 0; j <= bagSize; j++) {
                //如果当前物品不选,则直接选下一个
                int unSelect =dp[i+1][j];
                //如果当前物品可以选
                int select = 0;
                if (j >= weight[i]) {
                    select = value[i] + dp[i + 1][j - weight[i]];
                }
                dp[i][j] = Math.max(unSelect, select);
            }
        }
        return dp[0][bagSize];
    }
    public static void main(String[] args) {
        int[] weights = {3, 2, 4, 7};
        int[] values = {5, 6, 3, 19};
        int bag = 11;
        System.out.println(new Package().getMaxValue(weights, values, bag));
        System.out.println(new Package().getMaxValue2(weights, values, bag));
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031435.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号