动态规划解0-1备忘问题

这篇博客介绍了如何使用动态规划求解0/1背包问题,其中物品的重量和价值分别为wt和val,背包最大装载容量为W。动态规划策略通过穷举所有可能的选择,确定在不超过背包容量的情况下,能够获得的最大价值。博客详细阐述了动态规划的三要素:状态(背包容量和可选物品)、选择(装或不装物品)以及dp数组的含义,并提供了相应的Java代码实现。
摘要由CSDN通过智能技术生成

0- 问题描述

        背包可装载容量为W,现有N个物品,第 i 个物品的重量和价值分别为wt[ i ]val[ i ]。求不超过装载容量下,背包所装物品的最大价值。

1- 动态规划思路

        排序等方法对此没有用,必须要穷举所有的可能。这时候用动态规划可以提高效率。首先明确动态规划的三要素:状态、选择、dp数组的含义。

        (1)状态:①背包的容量;②可选择物品

        (2)选择:①装该物品;②不装该物品

        (3)dp数组含义

        有两个状态,故dp数组为二维dp[][], dp[i][j]表示背包容量为 i 下,可选择前 j 个物品的最大背包价值。需要求解的即dp[w][N]。

2- 代码

class Solution {
    public int baggage(int w, int[] val, int[] wt){
        //定义dp[i][j]表示背包重量为i下,装前j个物品的最大价值
        int n = val.length;
        int[][] dp = new int[w+1][n+1];
        //base case
        //dp[][0]和dp[0][]都是0
        //dp数组
        for(int i = 1; i <= w; i++){
            for(int j = 1; j < n; j++){
                //做选择的时机:当 当前容量大于该物品质量
                if(i > wt[j-1]){
                    //选择或者不选择该物品
                    dp[i][j] = Math.max(dp[i][j-1],//不选择该物品,容量不变,在前j-1个物品中选
                                dp[i - wt(j-1)][j-1] + val[j-1]);//选择该物品,其余的i - w[j]质量选择前j-1个物品
                                //不用担心w-wt(i)<小于0时会越界,因为有i > wt[j-1]
                }
                else{//否则,只能不选
                    dp[i][j] = dp[i][j-1];
                }
            }
        return dp[w][n];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值