Java 子集和查找所有相加为一个数字的子集

Java 子集和查找所有相加为一个数字的子集,java,sum,dynamic-programming,subset,subset-sum,Java,Sum,Dynamic Programming,Subset,Subset Sum,我一直在学习动态规划,我想把经典的子集和问题更进一步,通过打印出所有加起来就是一个数的子集。我该怎么做呢?到目前为止,我知道如何根据是否存在相加的子集来打印true或false public static boolean hasSum(int [] array, int sum) { int len = array.length; boolean[][] table = new boolean[sum+1][len+1]; int i; for( i

我一直在学习动态规划,我想把经典的子集和问题更进一步,通过打印出所有加起来就是一个数的子集。我该怎么做呢?到目前为止,我知道如何根据是否存在相加的子集来打印true或false

    public static boolean hasSum(int [] array, int sum)
{
    int len = array.length;
    boolean[][] table = new boolean[sum+1][len+1];

    int i;

    for( i = 0; i <= len; i++ )
        table[0][i] = true;

    for( i = 1; i <= sum; i++ )
        table[i][0] = false;

    for( 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];
        }
    }        

    return table[sum][len];
}
公共静态布尔hasSum(int[]数组,int和)
{
int len=array.length;
布尔[][]表=新布尔[sum+1][len+1];
int i;

对于(i=0;i这个问题比原来的问题更难

对于设置为
true
的每个
表[i][j]
,必须将其所有前辈标记为true,即所有
表[i1][j1]=true
,因此将
表[i][j]
标记为true。这样就可以构建一种图形结构。 此图的顶点是成对的
(i,j)


然后,当您想要打印答案时,您必须从
(i,j)
追溯到所有可能的
(i1,j1)
等等。对于这一点,仅仅一个数组是不够的,你需要额外的/helper数据结构。

是的,这就是我的想法。在表的每个索引中,我会存储最后一个数字吗?这样加起来就是说,10代表{2,4,5,6,8,1),我可以把1取为最后一个10,然后把5取为最后一个9,再加上4,然后把4加上4,使之成为[4,5,1]?我希望这是清楚的