我一直在学习动态编程,我想通过打印出所有加起来数字的子集来进一步考虑经典子集和问题。我到底该怎么做呢?截至目前,我知道如何根据是否存在与其相加的子集来打印真或假
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];
}
如果可能的话,我想返回所有子集的数组。
答案 0 :(得分:1)
这个问题比原来的问题困难。
对于您设置为table[i][j]
的每个true
,您必须标记其所有前辈,即所有table[i1][j1]=true
,因为您标记了table[i][j]
(i,j)
1}}如实。这样你就可以构建一种图形结构。
此图的顶点是耦合(i,j)
。
然后,当您想要打印答案时,您必须从(i1,j1)
追溯到所有可能的$('#datetimepicker4').datetimepicker({
format: 'HH:mm:ss'
});
,依此类推。对于这个,只是一个数组是不够的,你需要额外的/辅助数据结构。