01背包問題(Java實現)


關於背包問題,百度文庫上有崔添翼大神的《背包九講》,不明的請移步查看。這里僅介紹最基本的01背包問題的實現。

 1 public class Knapsack {
 2     private final int MIN = Integer.MIN_VALUE;
 3 
 4     @org.junit.Test
 5     public void test() {
 6         int[] w = {3, 2, 2};
 7         int[] v = {5, 10, 20};
 8         knapsackOptimal(5, w, v);
 9     }
10 
11     /**
12      * 01背包-容量壓縮
13      *
14      * @param c      包容量
15      * @param weight 各物品質量
16      * @param value  各物品價值
17      */
18     public void knapsackOptimal(int c, int[] weight, int[] value) {
19         int n = weight.length; //物品數量
20         int[] w = new int[n + 1];
21         int[] v = new int[n + 1];
22         int[][] G = new int[n + 1][c + 1];
23         for (int i = 1; i < n + 1; i++) {
24             w[i] = weight[i - 1];
25             v[i] = value[i - 1];
26         }
27 
28         //初始化values[0...c]=0————在不超過背包容量的情況下,最多能獲得多少價值
29         //原因:如果背包並非必須被裝滿,那么任何容量的背包都有一個合法解“什么都不裝”,這個解的價值為0,所以初始時狀態的值也就全部為0了
30         int[] values = new int[c + 1];
31         //初始化values[0]=0,其它全為負無窮————解決在恰好裝滿背包的情況下,最多能獲得多少價值的問題
32         //原因:只有容量為0的背包可以什么物品都不裝就能裝滿,此時價值為0,其它容量背包均無合法的解,屬於未定義的狀態,應該被賦值為負無窮
33         /*for (int i = 1; i < values.length; i++) {
34             values[i] = MIN;
35         }*/
36 
37         for (int i = 1; i < n + 1; i++) {
38             for (int t = c; t >= w[i]; t--) {
39                 if (values[t] < values[t - w[i]] + v[i]) {
40                     values[t] = values[t - w[i]] + v[i];
41                     G[i][t] = 1;
42                 }
43             }
44         }
45         System.out.println("最大價值為: " + values[c]);
46         System.out.print("裝入背包的物品編號為: ");
47         /*
48         輸出順序:逆序輸出物品編號
49         注意:這里另外開辟數組G[i][v],標記上一個狀態的位置
50         G[i][v] = 1:表示物品i放入背包了,上一狀態為G[i - 1][v - w[i]]
51         G[i][v] = 0:表示物品i沒有放入背包,上一狀態為G[i - 1][v]
52         */
53         int i = n;
54         int j = c;
55         while (i > 0) {
56             if (G[i][j] == 1) {
57                 System.out.print(i + " ");
58                 j -= w[i];
59             }
60             i--;
61         }
62     }
63 }

 

 

 

 

 

 

 

 

THE END.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM