问题场景:
国庆出去玩,行李箱只能装5公斤,但你想带:
- 单反相机(3kg,拍照必备)
- 烧水壶(1kg,喝热水方便)
- 5件衣服(5kg,每天换着穿)
- 充电宝(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空间,最少要扔掉多少价值的东西?"
一句话总结:
背包算法就是教你在限制条件下,如何聪明地做选择题!
更多感兴趣的可以了解一下运筹学的相关概念哦,比如最短路径,地铁路线规划问题等