通过DP的子集和

时间:2015-02-17 13:26:25

标签: java algorithm dynamic-programming

http://comproguide.blogspot.in/2013/10/subset-sum-problem.html上有一个关于这种方法的简明解释 但是,我通过一个小练习列举了这个算法,找到{1,2,3,4}中总和为4的子集。

我注意到单元格{1,1},{2,2}返回错误。

我是否理解逻辑错误?
或者算法不认为该集合是其自身的子集?

我原本期望{1,1}返回一个真值,因为1加起来。

2 个答案:

答案 0 :(得分: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]为真,因为{}总和为0
  • table [1] [1]为真,因为{1}总和为1
  • table [2] [2]为真,因为{2}总和为2
  • table [3] [2]为真,因为{1,2}总和为3
  • table [4] [3]为真,因为{1,3}总和为4

答案 1 :(得分:0)

我是这篇文章的作者。 @fgb显示的输出看起来是正确的。我没有看到代码有任何问题。我的解释有什么问题吗?