knapSack 背包问题

本文介绍了动态规划在解决背包问题中的应用,包括01背包和完全背包的经典案例。01背包问题中,每种物品只能选择一次,而完全背包则允许重复选择。通过状态方程和双重循环,动态规划有效地找到最优解。文章强调了理解和实践状态转移方程对于掌握这类问题的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包

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

背包问题(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]);
    }
}

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值