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

一句話總結(jié):
背包算法就是教你在限制條件下,如何聰明地做選擇題!
更多感興趣的可以了解一下運(yùn)籌學(xué)的相關(guān)概念哦,比如最短路徑,地鐵路線規(guī)劃問(wèn)題等
總結(jié)
到此這篇關(guān)于java解析背包問(wèn)題的文章就介紹到這了,更多相關(guān)java解析背包問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA獲取rabbitmq消息總數(shù)過(guò)程詳解
這篇文章主要介紹了JAVA獲取rabbitmq消息總數(shù)過(guò)程詳解,公司使用的是rabbitMQ,需要做監(jiān)控預(yù)警的job去監(jiān)控rabbitMQ里面的堆積消息個(gè)數(shù),如何使用rabbitMQ獲取監(jiān)控的隊(duì)列里面的隊(duì)列消息個(gè)數(shù)呢,需要的朋友可以參考下2019-07-07
剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來(lái)討論了HashMap的一些優(yōu)化點(diǎn),需要的朋友可以參考下2016-05-05
idea 隱藏target,iml等不需要展示的文件(推薦)
這篇文章主要介紹了idea 隱藏target,iml等不需要展示的文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
java識(shí)別一篇文章中某單詞出現(xiàn)個(gè)數(shù)的方法
這篇文章主要介紹了java識(shí)別一篇文章中某單詞出現(xiàn)個(gè)數(shù)的方法,涉及java字符解析操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
springcloud 服務(wù)降級(jí)的實(shí)現(xiàn)方法
這篇文章主要介紹了springcloud 服務(wù)降級(jí)的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
springboot+vue項(xiàng)目怎么解決跨域問(wèn)題詳解
這篇文章主要介紹了springboot+vue項(xiàng)目怎么解決跨域問(wèn)題的相關(guān)資料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,并總結(jié)了每種方法的適用場(chǎng)景、優(yōu)點(diǎn)和缺點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
Java中Double、Float類型的NaN和Infinity的具體使用
Java在處理浮點(diǎn)數(shù)運(yùn)算時(shí),提供了NaN和Infinity兩個(gè)常量,本文主要介紹了Java中Double、Float類型的NaN和Infinity的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

