【演算法資料結構Java實現】Java實現動態規劃(揹包問題)

李博Garvin發表於2015-02-05

1.背景

     追隨著buptwusuopu大神的腳步,最近在研習動態規劃。動態規劃應該叫一種解決問題的思想,記得又一次去某公司面試就被問到了這個。
       多於動態規劃的理解,大致是這樣的,從空集合開始,每增加一個元素就求它的最優解,直到所有元素加進來,就得到了總的最優解。
    
       比較典型的應用就是揹包問題,有一個重量一定的包,有若干件物品,他們各自有不同的重量和價值,怎樣背才能取得最大價值。
       錯誤的理解:去價值/重量比最大的物品多裝(之前我也是這麼想的,但是在揹包重量一定的情況下這麼做並不合理,範例很容易想到)

2.題目

       要實現的題目是摘抄於另一位大神的部落格,講的很好,可惜不是java實現的,有興趣可以看下面的引用。

題目描述:

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

nameweightvalue12345678910
a26066991212151515
b23033669991011
c65000666661011
d54000666661010
e460006666666


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

******************************************/


相關文章