动态规划.背包问题--填满背包的最大价格(java)

题目描述

背包问题 给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值 给定一个正数bag,表示一个载重bag的袋子,装的物品不能超过这个重量 返回能装下的最大价值

暴力递归

解题思路

要向获得最大值,其实就是在每一个物品之中做选择.
找出选择的最优解.
有了这个思路,那么递归就是在一个商品上选和不选去比较最大值,
递归的就已经出来了.
然后讨论base case 了,
一.weights 数组越界,没有商品可以选了,肯定是个结束条件
二.背包没有空间去装了,也是个base case 要返回的.
递归的结构和base case 都有了,直接看代码吧

代码演示

 /**
     * 获取最大值
     * @param w
     * @param v
     * @param bag
     * @return
     */
    public static int maxValue(int[]w,int[]v,int bag){
   
   
        //参数校验,题目中其实已经对数据限制了,
        if (null == w || v == null || w.length != v.length || w.length == 0 || bag < 0 ){
   
   
            return 0;
        }
        return process(w,v,0,bag);
    }


    /**
     * 递归方法
     * @param weights 不同商品重量
     * @param values 商品价值 和重量一一对应
     * @param index 下标值 代表要选第几号商品了
     * @param bag 背包容量
     * @return
     */
    public static int process(int<
### 动态规划求解背包问题Java实现 #### 定义子问题 在处理0/1背包问题时,定义合适的子问题是解决问题的关键。可以考虑两种方式来缩小原问题规模:一是减少物品数量;二是降低背包容量[^3]。 对于每种情况下的最优解,可以通过构建二维数组`dp[i][w]`表示从前i件物品中选取若干放入剩余空间恰好为w的背包所能获得的最大价值。这里i代表当前考虑到第几个物体而w则对应着此时可用的空间大小。 #### 初始化边界条件 当没有任何物品可供选择(i=0),无论背包容量多大,总价值都应初始化为零: ```java int[][] dp = new int[n + 1][W + 1]; // Initialize base cases where no item is available. for(int w = 0; w <= W ; ++w){ dp[0][w] = 0; } ``` 同样地,在任何情况下如果背包容量为零(w=0), 则其能容纳的价值也必定等于零: ```java // Initialize base cases when capacity equals zero. for(int i = 0; i <= n ; ++i){ dp[i][0] = 0; } ``` #### 填充DP表 接下来填充整个表格的过程就是寻找状态转移方程并迭代计算每一个可能的状态值。对于每个位置`(i,w)`来说,有两种可能性——要么不放这个物品(`v[i]>w`),那么最大收益就取决于前一个阶段相同重量的结果即`dp[i-1][w]`; 要么放置该物品,则新的总重变为`w-v[i]`, 新增加的价值量为`p[i]+dp[i-1][w-v[i]]`. 取两者较大者作为最终结果存储于当前位置上. ```java for (int i = 1; i <= n; ++i) { for (int w = 1; w <= W; ++w) { if (weights[i - 1] > w) { // If current weight exceeds remaining capacity, dp[i][w] = dp[i - 1][w]; // Do not include this item. } else { // Choose between including or excluding the current item based on maximum profit. dp[i][w] = Math.max(dp[i - 1][w], profits[i - 1] + dp[i - 1][w - weights[i - 1]]); } } } ``` 上述代码片段实现了通过动态规划方法解决给定实例文件中的具体数值输入版本[^1]。 最后返回的是填满后的最后一格数据也就是`dp[n][W]`所记录的最佳方案下可以获得的最大利润。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值