動態規劃之完全揹包問題(java實現)
阿新 • • 發佈:2018-11-24
之前寫了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()); } }