【演算法資料結構Java實現】Java實現動態規劃(揹包問題)
1.背景
追隨著buptwusuopu大神的腳步,最近在研習動態規劃。動態規劃應該叫一種解決問題的思想,記得又一次去某公司面試就被問到了這個。
多於動態規劃的理解,大致是這樣的,從空集合開始,每增加一個元素就求它的最優解,直到所有元素加進來,就得到了總的最優解。
比較典型的應用就是揹包問題,有一個重量一定的包,有若干件物品,他們各自有不同的重量和價值,怎樣背才能取得最大價值。
錯誤的理解:去價值/重量比最大的物品多裝(之前我也是這麼想的,但是在揹包重量一定的情況下這麼做並不合理,範例很容易想到)
2.題目
要實現的題目是摘抄於另一位大神的部落格,講的很好,可惜不是java實現的,有興趣可以看下面的引用。
題目描述:
有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?
name | weight | value | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
a | 2 | 6 | 0 | 6 | 6 | 9 | 9 | 12 | 12 | 15 | 15 | 15 |
b | 2 | 3 | 0 | 3 | 3 | 6 | 6 | 9 | 9 | 9 | 10 | 11 |
c | 6 | 5 | 0 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 10 | 11 |
d | 5 | 4 | 0 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 10 | 10 |
e | 4 | 6 | 0 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
3.程式碼實現
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
final int packageWheight=10;//包的重量
Package[] pg={
new Package(6,2,"a"),
new Package(3,2,"b"),
new Package(5,6,"c"),
new Package(4,5,"d"),
new Package(6,4,"e")
};
int[][] bestValues = new int[pg.length+1][packageWheight+1];
for(int i=0;i<=pg.length;i++){
for(int j=0;j<=packageWheight;j++){
if(i==0||j==0){
bestValues[i][j]=0;//臨界情況
}
else{
if(j<pg[i-1].getWheight()){
bestValues[i][j] = bestValues[i-1][j];//當第n件物品重量大於包的重量時,最佳值取前n-1件的
}
else{
int iweight = pg[i-1].getWheight(); //當第n件物品重量小於包的重量時,分兩種情況,分別是裝第n件或不裝,比較取最大
int ivalue = pg[i-1].getValue();
bestValues[i][j] =
Math.max(bestValues[i-1][j], ivalue + bestValues[i-1][j-iweight]);
}
}
}
}
System.out.print(""+bestValues[pg.length][packageWheight]);
}
}
public class Package {
int value;
int wheight;
String name;
Package(int value,int wheight,String name){
this.value=value;
this.wheight=wheight;
this.name=name;
}
public int getWheight(){
return wheight;
}
public int getValue(){
return value;
}
public String getName(){
return name;
}
}
有興趣的同學可以到我的github去clone這個工程:https://github.com/jimenbian/DynamicPrograme
/********************************
* 本文來自部落格 “李博Garvin“
* 轉載請標明出處:http://blog.csdn.net/buptgshengod
******************************************/
相關文章
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- Java實現-揹包問題IJava
- Java實現-揹包問題IIJava
- Java實現-揹包問題VIJava
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 前端與演算法-動態規劃之01揹包問題淺析與實現前端演算法動態規劃
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 動態規劃篇——揹包問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 【動態規劃】01揹包問題【續】動態規劃
- 0-1揹包問題(動態規劃)動態規劃
- [資料結構與演算法]-動態規劃之揹包演算法終極版資料結構演算法動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃系列之六01揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 0-1揹包問題 動態規劃法動態規劃
- 動態規劃-揹包類動態規劃
- 【動態規劃】一次搞定三種揹包問題動態規劃
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 雙核處理(動態規劃的01揹包問題)動態規劃
- 【資料結構與演算法】揹包問題總結梳理資料結構演算法
- 【演算法資料結構Java實現】歐幾里得演算法演算法資料結構Java
- 【動態規劃】字串最小編輯距離Java實現動態規劃字串Java
- 演算法與資料結構-棧(Stack)-Java實現演算法資料結構Java
- 【演算法資料結構Java實現】折半查詢演算法資料結構Java
- 資料結構和演算法面試題系列—揹包問題總結資料結構演算法面試題
- 醜數問題——動態規劃、Java動態規劃Java
- 揹包問題演算法全解析:動態規劃和貪心演算法詳解演算法動態規劃
- 動態規劃0-1揹包動態規劃
- 資料結構與演算法——0-1揹包問題資料結構演算法
- Java實現資料結構之線性結構Java資料結構