java解析背包問題實例代碼(簡單易懂)
問題場景:
國慶出去玩,行李箱只能裝5公斤,但你想帶:
- 單反相機(3kg,拍照必備)
- 燒水壺(1kg,喝熱水方便)
- 5件衣服(5kg,每天換著穿)
- 充電寶(0.5kg,手機沒電會焦慮)
問:怎么裝才能既不超過重量,又讓旅行最舒服?
1. 核心思想
用一個表格(叫dp)記錄不同重量能裝的最大價值。比如:
表格行:物品(相機、燒水壺...)
表格列:行李箱剩余容量(0kg~5kg)
填表規(guī)則:每次決定裝不裝當前物品,選價值更高的方案。
2. 直接上代碼
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("最優(yōu)組合價值:" + dp[weights.length][maxWeight]);
}
}3. 通俗解釋
dp[i][w]的意思:用前i個物品、限重w時能獲得的最大價值。
關鍵判斷:如果當前物品比剩余容量輕(weights[i] <= w),就看看裝它會不會更劃算。
舉一反三:這算法還能用在哪?
時間管理:把"重量"換成"小時","價值"換成"任務收益",幫你高效安排周末。
省錢技巧:超市購物時,算算哪些東西性價比最高,錢包和幸福感兼得。
斷舍離:反向操作——"為了騰出5kg空間,最少要扔掉多少價值的東西?"

一句話總結:
背包算法就是教你在限制條件下,如何聰明地做選擇題!
更多感興趣的可以了解一下運籌學的相關概念哦,比如最短路徑,地鐵路線規(guī)劃問題等
總結
到此這篇關于java解析背包問題的文章就介紹到這了,更多相關java解析背包問題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis-Plus使用updateById()、update()將字段更新為null
本文主要介紹了Mybatis-Plus使用updateById()、update()將字段更新為null,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
SpringBoot根據注解動態(tài)執(zhí)行類中的方法實現
本文主要介紹了SpringBoot根據注解動態(tài)執(zhí)行類中的方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08
elasticsearch集群cluster主要功能詳細分析
這篇文章主要為大家介紹了elasticsearch集群cluster主要功能詳細分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
springboot利用aop實現接口異步(進度條)的全過程
我們在開發(fā)中,調用第三方接口時,往往是提交數據,要異步去獲取數據,下面這篇文章主要給大家介紹了關于springboot利用aop實現接口異步(進度條)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-01-01
Docker容器使用宿主機上的mongod/redis等服務詳解
這篇文章主要介紹了Docker容器使用宿主機上的mongod/redis等服務詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

