背包问题

面试可能
考的是0-1背包和完全背包问题。

概述

0-1背包

这里的动态规划是根据递归改的,dp[i][j]的含义是当查看到物品索引为i,剩余空间为j的时候,此时的最大价值。最后返回的是dp[0][20],也就是当从0索引开始的时候,背包容量为20的时候的值

package dynamic;
public class Knapsack {

//  递归方法主方法
    public static int maxValue(int[] w,int[] v,int bag){
        return process(w,v,0,bag);
    }

    /**
     不变的量:w[] 所有货物重量数组  v[]价值数组   bag背包总重量
     process函数  求的是index...往后的价值
     0..index-1上做了货物的选择,使得你达到的重量是alreadyW
     如果返回-1,认为没有方案
     如果不返回-1,则认为返回的值是真实价值
     */
    // 推荐的经典方法
    public static int process(int[] w,int[] v,int index,int rest){
        if (rest<0){    //case 1 剩余空间不足
            return -1;
        }
        // rest > 0

        // 货物已经遍历完
        if (index == w.length){  // base case2
            return 0;
        }

        // 有货也有空间
        // 不添加当前index货物
        int p1 = process(w,v,index+1,rest);

        // 添加当前index货物
        int p2 = -1;
        int p2Next = process(w,v,index+1,rest-w[index]);
        if (p2Next!=-1){
            p2 = v[index]+p2Next;
        }

        return Math.max(p1,p2);
    }





    public static int dpWay(int[] w,int[] v,int bag){
        int N = w.length;
        int[][] dp = new int[N+1][bag+1];
        // dp[N][...] = 0      最底下的一列初始值为0
        for (int index = N-1; index >= 0; index--) {
            for (int rest = 0; rest < bag; rest++) {    // rest < 0
                int p1 = dp[index+1][rest];
                int p2 = -1;
                if (rest-w[index]>=0){
                    p2 = v[index] + dp[index+1][rest-w[index]];
                }
                dp[index][rest] = Math.max(p1,p2);
            }
        }
        return dp[0][bag];
    }

}

参看:https://www.bilibili.com/video/BV1M44y1n78z?p=20&vd_source=46d50b5d646b50dcb2a208d3946b1598

10分钟

完全背包

参考:https://www.bilibili.com/video/BV1C7411K79w?p=2&vd_source=46d50b5d646b50dcb2a208d3946b1598

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示