簡體   English   中英

通過DP的子集總和

[英]subset sum through DP

http://comproguide.blogspot.in/2013/10/subset-sum-problem.html上對此方法進行了簡要說明。
但是,我通過一個小練習來枚舉此算法,以在{1,2,3,4}中找到總計為4的子集。

我注意到單元格{1,1},{2,2}返回了false。

我是否理解錯誤的邏輯?
還是算法不將集合視為其子集?

我本來希望{1,1}會返回true,因為1會加上自身。

{1}應該算作一個總計為1的子集。我已經在程序中添加了一些輸出以顯示該表:

public class SubsetSum {
    public static void main(String[] args) {
        int [] array = { 1, 2, 3, 4 };
        hasSum(array, 4);
    }

    public static boolean hasSum(int [] array, int sum) {
        int len = array.length;
        boolean[][] table = new boolean[sum+1][len+1];
        for(int i = 0; i <= len; i++) table[0][i] = true;
        for(int i = 1; i <= sum; i++) table[i][0] = false;
        for(int i = 1; i <= sum; i++) {
            for(int j = 1; j <= len; j++) {
                table[i][j] = table[i][j-1];
                if(!table[i][j] && i >= array[j-1]) {
                    table[i][j] = table[i-array[j-1]][j-1];
                }
            }
        }

        System.out.printf("%10s ", "-");
        for(int i = 0; i <= sum; i++) {
            System.out.printf("%10s ", i);
        }
        System.out.println();
        for(int j = 0; j <= len; j++) {
            System.out.printf("%10s ", j);
            for(int i = 0; i <= sum; i++) {
                System.out.printf("%10s ", table[i][j]);
            }
            System.out.println();
        }

        return table[sum][len];
    }
}

輸出:

     -          0          1          2          3          4 
     0       true      false      false      false      false 
     1       true       true      false      false      false 
     2       true       true       true       true      false 
     3       true       true       true       true       true 
     4       true       true       true       true       true 

這些結果看起來正確。 我會解釋一些值,例如:

  • table [0] [0]為true,因為{}總計為0
  • table [1] [1]為真,因為{1}等於1
  • table [2] [2]為真,因為{2}等於2
  • table [3] [2]為真,因為{1,2}等於3
  • table [4] [3]為真,因為{1,3}等於4

我是該帖子的作者。 @fgb顯示的輸出看起來正確。 我看不到代碼有任何問題。 我的解釋有什么問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM