当前位置: 首页 > 知识库问答 >
问题:

子集总和查找所有加起来等于一个数字的子集

凌黎明
2023-03-14

我一直在学习动态规划,我想通过打印出所有相加为一个数字的子集来进一步研究经典的子集和问题。我该怎么做呢?到目前为止,我知道如何根据是否存在相加的子集来打印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];
}

如果可能,我想返回所有子集的数组。

共有1个答案

黄凌龙
2023-03-14

这个问题比原来的问题更难。

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

然后当您想打印答案时,您必须从(i, j)回溯到所有可能的(i1, j1)等等。为此,只有一个数组是不够的,您需要额外的/助手数据结构。

 类似资料:
  • 我有个算法问题。我试图从一个更大的值集合中找到所有唯一的值子集。 例如,假设我有集。我能用什么算法找到3的这些子集? 子集不应重复,且顺序不重要,因此集{1,2,3}与集{3,2,1}相同。鼓励使用Psudocode(或常规类型)。

  • 给定一个由N个元素组成的数组,找出数组的所有子集,其和等于目标值。 我已经看到了所有关于子集和的老问题,但没有一个对我有用。 输入的第一行包含数组的整数N大小 第二行包含由空格分隔的数组元素 目标和值 打印所有子数组(元素索引)。 我的代码对于小的输入工作得很好,但是对于N>150则需要很长的时间。有没有其他有效的算法可以做到这一点。请告诉我如何优化此代码以适应较大的输入。 这是我的代码 需要花费

  • 问题内容: 我有一个数字清单。我也有一定数目 该总和由我列表中的几个数字得出(我可能/可能不知道它是由多少个数字组成的)。是否有一种快速算法来获取可能的数字列表?用Python编写会很棒,但是伪代码也很好。(除Python:P之外,我什么都看不到) 例 注意: 我确实知道算法,可以从大小为n的列表中找到哪些数字总和为另一个数字(但是我无法读取C#,也无法检查它是否满足我的需求。我在Linux上,尝

  • 这类似于子集和问题,只是稍有不同,不是检查集合是否有一个和为9的子集,而是我们必须找到这样的子集的个数。我在这里遵循子集和问题的解法。但是我想知道如何修改它来返回子集的计数。

  • 问题内容: 我正在考虑一个应用程序的设计,该应用程序的主要功能围绕着找到所有给定集合的子集的集合的能力而展开。 例如,给定输入集A = {1,2,3 … 50}和集合集B = {B1 = {3,5,9,12},B2 = {1,6,100,123,45}。 .. B500 = {8,67,450}},返回所有属于A子集的B。 我想它与搜索引擎类似,除了我并没有设置A小而B大的奢侈。在我的情况下,B通

  • 使用递归,编写一个给定整数列表和给定和的程序,将找到总数为给定和的所有数字子集。计算找到的子集数。如果不存在子集,则应指示未找到解决方案。例如,给定列表6、13、3、3,且总和为19,您的程序应找到两个解决方案: 将输入列表中的整数数限制为最多20个整数。仅接受正整数,并使用0标记列表的结尾。以下是运行示例: 这是我的代码,但它只找到一个子集,我想找到所有子集。有什么帮助吗?