1. 程式人生 > >動態規劃之完全揹包問題(java實現)

動態規劃之完全揹包問題(java實現)

之前寫了01揹包問題,現在寫完全揹包問題。和01揹包不同的是,完全揹包不限定某種物品的件數,可以裝0,1,2,...,而01揹包只有裝與不裝的區別。但是思考問題的方式還是一樣的,我就其中的最大值。詳細程式碼和註釋見下面程式碼。

package backpack;

/*
f[i][v]:前i件物品放入揹包容量為v的揹包獲得的最大收益
f[i][v] = max(f[i - 1][v],f[i - 1][v - k * Wi] + k * Vi,其中 1<=k<= v/Wi)
邊界條件
f[0][v] = 0;
f[i][0] = 0;
*/
public class CompleteBackpack {
	private static final int N = 3;
	private static final int V = 5;
	private int weight[] = {0,3,2,2};
	private int Value[] = {0,5,10,20};	 
	private int f[][]=new int[N+1][V+1];
	
	public int Completeknapsack()
	{
		//邊界條件,第0行和第0列的值設為0
		for (int i = 0;i <= N;i++){
			f[i][0] = 0;
		}
		for (int v = 0;v <= V;v++){
			f[0][v] = 0;
		}
		//遞推
		for (int i = 1;i <= N;i++){
			for (int v = 1;v <= V;v++){
				f[i][v] = 0;
				int nCount = v / weight[i];  //最多可以放nCount個物品i
				//和01揹包的區別就在這裡,01揹包只有兩種狀態:放與不放
				//而完全揹包可以放0到k個物品i,同樣是取最大值
				for (int k = 0;k <= nCount;k++){
					f[i][v] = Math.max(f[i][v],f[i - 1][v - k * weight[i]] + k * Value[i]);
				}
			}
		}
		return f[N][V];
	}
	public static void main(String[] args) {
		System.out.println(new CompleteBackpack().Completeknapsack());

	}

}