knapSack 背包问题

Posted MirrorML

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了knapSack 背包问题相关的知识,希望对你有一定的参考价值。

背包

动态规划的基础案例: 几个背包问题

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
解决核心是状态方程及第i个物品选或不选
max(dp[i],dp[j-i]+v)

01背包

01背包就是每种物品是只能选择一次。
若题目改为恰好装满背包,创建数组时除了物品,其他空间置为负无穷。

public class KnapSack01 {
    public static void main(String[] args) {
        int N,W;
        Scanner scanner=new Scanner(System.in);
        N=scanner.nextInt();
        W=scanner.nextInt();
        int[] dp=new int[12880];
        for (int i=0;i<N;i++){
            int m=scanner.nextInt();
            int q=scanner.nextInt();
            for (int j=W;j>=m;j--){
                dp[j]=Math.max(dp[j],dp[j-m]+q);
            }
        }
        System.out.println(dp[W]);
    }
}

完全背包

完全背包就是每种物品是能多次选择。

public class KnapSack {
    public static void main(String[] args) {
        int N,W;
        Scanner scanner=new Scanner(System.in);
        N=scanner.nextInt();
        W=scanner.nextInt();
        int[] dp=new int[12880];
        for (int i=0;i<N;i++){
            int m=scanner.nextInt();
            int q=scanner.nextInt();
            for (int j=m;j<=W;j++){
                dp[j]=Math.max(dp[j],dp[j-m]+q);
            }
        }
        System.out.println(dp[W]);
    }
}

总结

背包问题的核心就是状态的判定,自己多写几次更能理解。

以上是关于knapSack 背包问题的主要内容,如果未能解决你的问题,请参考以下文章

knapSack 背包问题

knapSack 背包问题

[LeetCode] Knapsack Problem背包问题

0-1背包问题(0-1 knapsack problem)

knapsack problem 背包问题 贪婪算法GA

0-1背包问题(the knapsack problem)