背包問題-動態(tài)規(guī)劃java實(shí)現(xiàn)的分析與代碼
一、動態(tài)規(guī)劃的原理
動態(tài)規(guī)劃(dynamic programming)是運(yùn)籌學(xué)的一個分支,是求解決策過程(decision process)最優(yōu)化的數(shù)學(xué)方法。20世紀(jì)50年代初美國數(shù)學(xué)家R.E.Bellman等人在研究多階段決策過程(multistep decision process)的優(yōu)化問題時,提出了著名的最優(yōu)化原理(principle of optimality),把多階段過程轉(zhuǎn)化為一系列單階段問題,利用各階段之間的關(guān)系,逐個求解,創(chuàng)立了解決這類過程優(yōu)化問題的新方法–動態(tài)規(guī)劃。1957年出版了他的名著《Dynamic Programming》,這是該領(lǐng)域的第一本著作。
動態(tài)規(guī)劃一般可分為線性動規(guī),區(qū)域動規(guī),樹形動規(guī),背包動規(guī)四類。舉例:線性動規(guī):攔截導(dǎo)彈,合唱隊(duì)形,挖地雷,建學(xué)校,劍客決斗等;區(qū)域動規(guī):石子合并, 加分二叉樹,統(tǒng)計(jì)單詞個數(shù),炮兵布陣等;樹形動規(guī):貪吃的九頭龍,二分查找樹,聚會的歡樂,數(shù)字三角形等;背包問題:01背包問題,完全背包問題,多重背包問題,分組背包問題,二維背包,裝箱問題,擠牛奶(同濟(jì)ACM第1132題)等;
二、分析與代碼實(shí)現(xiàn)
1、分析
題目:在某個深夜里,一個小偷背著一個總共只能裝16v體積的背包進(jìn)入一家商店偷東西。假如店里有手機(jī)一部,價(jià)格為2000元,體積為1v;薯片一包,價(jià)格為5元,體積為5v;翡翠一塊,價(jià)格為100000元,體積為10v;一套四大名著,價(jià)格30元,體積為6v;電腦一臺,價(jià)格為6000元,體積為10v。怎么樣能夠讓背包裝的下,并且又能使拿到的東西總價(jià)格最多?
這種情況下,一共5件東西。小偷偷東西的事件只有兩種:拿,不拿。
當(dāng)他拿的時候,背包體積變小,物件數(shù)量減1;當(dāng)他不拿的時候,背包體積不變,物件數(shù)量減1(因?yàn)樾⊥颠x擇不拿這件東西的時候不會返回繼續(xù)拿,所以他失去了這件東西選擇的機(jī)會)。
物件數(shù)量為i,背包容納量為v。
1.不拿 b(i-1,v)
2.拿 b(i-1,v-該物品的體積)
兩者取最大值
核心代碼:
b[i][j]=Math.max(b[i-1][j],b[i-1][j-v]+p);
2、代碼分析
public class _背包問題 {
//物品體積
private static int[] volume={1,5,10,6,10};
//物品價(jià)格
private static int[] price={2000,5,100000,30,6000};
//背包容量
private static int maxVolumen=16;
//物品數(shù)量
private static int count=5;
public static int solution(int maxVolumen,int count,int[] volume,int[] price){
int[][] b=new int[count+1][maxVolumen+1];
for (int i=1;i<=count;i++){
//拿到物品的價(jià)格
int p=price[i-1];
//拿到物品的體積
int v=volume[i-1];
for (int j=1;j<=maxVolumen;j++){
//如果物品的體積大于背包容量時,選擇不拿。
if (j<v){
b[i][j]=b[i-1][j];
continue;
}
b[i][j]=Math.max(b[i-1][j],b[i-1][j-v]+p);
}
}
return b[count][maxVolumen];
}
public static void main(String[] args) {
System.out.println(solution(16,5,volume,price));
}
}
總結(jié)
到此這篇關(guān)于背包問題-動態(tài)規(guī)劃java實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)背包問題 動態(tài)規(guī)劃java實(shí)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA+MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐
本文主要介紹了JAVA+MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐,包括水平分表、垂直分表和水平分庫等策略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Spring注解驅(qū)動之BeanDefinitionRegistryPostProcessor原理解析
這篇文章主要介紹了Spring注解驅(qū)動之BeanDefinitionRegistryPostProcessor原理,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
Spring?BOOT?AOP基礎(chǔ)應(yīng)用教程
這篇文章主要介紹了Spring?BOOT?AOP的使用,文章從相關(guān)問題展開全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
ssh框架實(shí)現(xiàn)文件上傳下載實(shí)例代碼
本篇文章主要介紹了ssh框架文件上傳下載實(shí)例代碼,實(shí)例分析了Spring+struts+Hibernate的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
詳解使用Spring3 實(shí)現(xiàn)用戶登錄以及權(quán)限認(rèn)證
這篇文章主要介紹了詳解使用Spring3 實(shí)現(xiàn)用戶登錄以及權(quán)限認(rèn)證,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-03-03

