java解析背包问题,简单易懂

问题场景‌:

国庆出去玩,行李箱只能装5公斤,但你想带:

  1. 单反相机(3kg,拍照必备)
  2. 烧水壶(1kg,喝热水方便)
  3. 5件衣服(5kg,每天换着穿)
  4. 充电宝(0.5kg,手机没电会焦虑)

:怎么装才能既不超过重量,又让旅行最舒服?

1. 核心思想‌
用一个表格(叫dp)记录不同重量能装的最大价值。比如:

表格行:物品(相机、烧水壶...)
表格列:行李箱剩余容量(0kg~5kg)
填表规则:‌每次决定装不装当前物品‌,选价值更高的方案。
2. 直接上代码‌


java
public class PackingHelper {
    public static void main(String[] args) {
        int maxWeight = 5; // 行李箱限重5kg
        double[] weights = {3, 1, 5, 0.5}; // 每个物品的重量
        int[] values = {10, 4, 7, 3};     // 物品的重要性打分(自己设定)

        // 开始填表
        int[][] dp = new int[weights.length + 1][maxWeight + 1];
        for (int i = 1; i <= weights.length; i++) {
            for (int w = 0; w <= maxWeight; w++) {
                if (weights[i - 1] <= w) {
                    // 能装下时:比较"装"和"不装"哪个更划算
                    dp[i][w] = Math.max(
                        dp[i - 1][w], // 不装
                        dp[i - 1][w - (int) weights[i - 1]] + values[i - 1] // 装
                    );
                } else {
                    dp[i][w] = dp[i - 1][w]; // 装不下,直接跳过
                }
            }
        }
        System.out.println("最优组合价值:" + dp[weights.length][maxWeight]);
    }
}

3. 通俗解释‌
dp[i][w]的意思‌:用前i个物品、限重w时能获得的最大价值。
关键判断‌:如果当前物品比剩余容量轻(weights[i] <= w),就看看装它会不会更划算。
三、举一反三:这算法还能用在哪?‌
时间管理‌:把"重量"换成"小时","价值"换成"任务收益",帮你高效安排周末。
省钱技巧‌:超市购物时,算算哪些东西性价比最高,钱包和幸福感兼得。
断舍离‌:反向操作——"为了腾出5kg空间,最少要扔掉多少价值的东西?"


一句话总结‌:

背包算法就是教你在限制条件下,如何聪明地做选择题!

更多感兴趣的可以了解一下运筹学的相关概念哦,比如最短路径,地铁路线规划问题等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值