01背包(DP优化版)

public class ZeroOneBagOptimize {
    public static void main(String[] args) {
        System.out.println(test());
    }

    private static int test() {
        int[] weights = {1, 3, 4};
//        int[] weights = {2, 2, 3, 1, 5, 2};
        int[] values = {15, 20, 30};
//        int[] values = {2, 3, 1, 5, 4, 3};
        return zeroOneBag(weights, values, 4);
//        return zeroOneBag(weights, values, 1);
    }

    private static int zeroOneBag(int[] weights, int[] values, int bagSize) {
        // dp含义:能获得的最大价值量
        int[] dp = new int[bagSize + 1];
        // 没有物品或者没有容量时,总价值都为0
        for (int i = 0; i < values.length; i++) {
			// 倒序遍历的原因就是因为一维数组,如果正序dp[j - weights[i]] + values[i]获取的就是新值
            for (int j = dp.length - 1; j >= 0; j--) {
                if (j >= weights[i]) {
                    dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
                }
            }
        }
        return dp[bagSize];
    }
}

通过空间优化本的0-1背包问题解法,可以利用一维数组进行优化。这是因为在0-1背包问题中,每个物品只能选择放入背包一次或不放入,所以在计算第i个物品放入容量为j的背包的最大价值时,只需要考虑前i-1个物品放入容量为j的背包的最大价值和前i-1个物品放入容量为j-vol[i的背包的最大价值加上第i个物品的价值,取两者的较大值即可。通过这种方式,可以将二维数组转化为一维数组来实现空间优化。 具体的实现方法如下: 1. 创建一个一维数组dp,长度为背包的容量V+1,用于存储每个容量下的最大价值。 2. 遍历每个物品,从最后一个物品开始倒序遍历。 3. 对于当前遍历到的物品i,在容量为j的背包中,判断是否能够放入该物品: - 若当前容量j小于物品i的体积vol[i,则无法放入,最大价值保持不变,即dp[j = dp[j。 - 若当前容量j大于等于物品i的体积vol[i,则可以选择放入该物品或不放入该物品,取两者的较大值作为最大价值,即dp[j = max(dp[j], dp[j-vol[i]] + val[i])。 4. 完成遍历后,最终的最大价值即为dp[V。 这样,通过一维数组的空间优化,可以在0-1背包问题中节省空间,并且得到相同的最优解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [leetcode 背包类问题](https://blog.csdn.net/u014034683/article/details/114481074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [0-1背包问题的一维数组优化解析](https://blog.csdn.net/hnjzsyjyj/article/details/126071689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值