動態規劃之揹包問題

package dongtaiguihua;
//有N件物品和一個容量爲V的揹包。第i件物品的體積是c[i],價值是v[i]。求解將哪些物品裝入揹包可使價值總和最大。
// 體積c[5] = {3,5,2,7,4};  價值爲 v[5] = {2,4,1,6,5};揹包的體積爲10
//問題分解:
//“將前i件物品放入容量爲y的揹包中”這個子問題,若只考慮第i件物品的策略(放或不放),
//那麼就可以轉化爲一個只牽扯前i-1件物品的問題。
//如果不放第i件物品,那麼問題就轉化爲“前i-1件物品放入容量爲y的揹包中”,價值爲f[i-1][y];
//如果放第i件物品,那麼問題就轉化爲“前i-1件物品放入剩下的容量爲y-Wi的揹包中”,
//此時能獲得的最大價值就是f[i-1][y-Wi]再加上通過放入第i件物品獲得的價值Pi。
//所以只要比較一下f[i-1][j]的價值大還是f[i-1][y-Wi]+pi價值大即可
public class BeiBao {
	public static void main(String[] args) {
		int[] c = {3,5,2,7,4};//物品體積
		int[] v = {2,4,1,6,5};//物品價值
		int begV = 10;//揹包體積
		int[][] cvs = new int[5][10];
		
		for(int i = 1; i < c.length;i++){
			for(int j = 1 ; j < begV ; j++){
				//如果體積太大,放不進去
				System.out.println("把第"+i+"個物品放到體積爲"+j+"的袋子中");
				if(c[i]>j){
					cvs[i][j] = cvs[i-1][j];
					System.out.println("太大了,沒有放進去");
				}else{
					if(cvs[i-1][j]>cvs[i-1][j-c[i]]+v[i]){
						System.out.println("不放第"+i+"個物品");
					}else{
						System.out.println("放第"+i+"個物品");
					}
					cvs[i][j] = max(cvs[i-1][j],cvs[i-1][j-c[i]]+v[i]);
					System.out.println("價值是"+cvs[i][j]);
				}
				System.out.println("---------------");
			}
			System.out.println();
			System.out.println("=============");
		}
		System.out.println();
	}
	public static int max(int a,int b){
		return a>b?a:b;
	}
	
}


不能確定是否正確,還有一些疑問。並沒有思考的很清楚,但是應該是這個思路,需要在邊界等細節上好好考慮一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章