1. 程式人生 > >0-1揹包問題(Java)

0-1揹包問題(Java)

  文章參考博文:http://blog.csdn.net/mu399/article/details/7722810。從該文章中熟悉了演算法的動態規劃思想,簡單地用Java實現了演算法的思想。

  引數:v表示物品的價值,s表示物品的質量,C表示揹包的容量。令M[i,j]表示將物品1-i裝入容量為j的揹包可獲得的最大價值(並不是把1-i都放進去),遞迴式如下:

M(i , j) = Max{ M( i-1, j ) , M( i-1, j-si ) + vi }

  Java的實現記錄如下:

void ZeroOnePackage(int []v, int[] s, int C){
		int[][] M = new int[v.length][C+1];
		int max = 0;
		for (int i=0; i<v.length; i++){
			if(s[i]<=C)
				for(int j=s[i];j<=C;j++)
					M[i][j] = v[i];
		}
		for (int i=0; i<v.length; i++){
			for(int j=0; j<=C; j++){
				if(i>0 && j-s[i]>=0)
					M[i][j] = Math.max(M[i-1][j],M[i-1][j-s[i]]+v[i] );
				if(M[i][j]>max)
					max = M[i][j];
			}
		}
		System.out.println("Max ="+ max);
	}