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

查找与特定值相加的所有子集

艾焱
2023-03-14

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

共有1个答案

胡沈义
2023-03-14
def total_subsets_matching_sum(numbers, sum):
    array = [1] + [0] * (sum)
    for current_number in numbers:
        for num in xrange(sum - current_number, -1, -1):
            if array[num]:
                array[num + current_number] += array[num]
    return array[sum]

assert(total_subsets_matching_sum(range(1, 10), 9)       == 8)
assert(total_subsets_matching_sum({1, 3, 2, 5, 4, 9}, 9) == 4)

解释

这是经典问题之一。其思想是找到与当前数可能的和的个数。这是真的,有一种方法使和为0。刚开始的时候,我们只有一个号码。我们从我们的目标(解决方案中的变量最大值)开始,然后减去这个数字。如果有可能得到该数字的和(对应于该数字的数组元素不是零),则将其添加到对应于当前数字的数组元素中。这样程序就更容易理解了

for current_number in numbers:
    for num in xrange(sum, current_number - 1, -1):
        if array[num - current_number]:
            array[num] += array[num - current_number]

当数字为1时,只有一种方法,你可以得出1的和(1-1变成0,对应0的元素是1)。所以数组将是这样的(记住元素零将有1)

[1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 2, 1, 1, 1, 0, 0, 0]
[1, 1, 1, 2, 2, 2, 2, 2, 1, 1]
[1, 1, 1, 2, 2, 3, 3, 3, 3, 3]
[1, 1, 1, 2, 2, 3, 4, 4, 4, 5]
[1, 1, 1, 2, 2, 3, 4, 5, 5, 6]
[1, 1, 1, 2, 2, 3, 4, 5, 6, 7]
[1, 1, 1, 2, 2, 3, 4, 5, 6, 8]
 类似资料:
  • 这是我的OWL文件的一部分: 如何仅从属性中获取

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

  • 下面是适当的方法签名的样子: (问题领域是扑克;列举奥马哈扑克牌中所有可能的板卡组合。是的,还有其他方法可以解决这个问题,但我正在测试这个方法,因为处理比特比大多数其他选择要快得多。)

  • 问题内容: 我正在开发一个应用程序(Quartz调度程序),其中有一个作业类负责实际执行工作,我们需要在Quartz调度程序中创建触发器时告知/传递作业类的名称。 我想为所有想使用该API的人提供一个扩展点(除了我将作为API的一部分提供的一些通用作业之外)。这个想法是创建一个(标记)接口,如果有人想将其类声明为调度程序作业类,那么他们要做的就是(声明)实现该接口。 我不确定如何找到合约之后的类(

  • 问题内容: 我不知道如何在下面编写查询。 我的桌子是 我需要在col2中同时存在两个参数的地方选择不同的col1 id。例如。如果我发送6,7应该发送给我5 问题答案: 尝试:

  • 问题内容: 尽管我们已部署了最新的类,但我们正在使用的是旧版本的类。要扫描应用程序服务器所有子文件夹中的所有JAR文件,我们如何编写一个小的Shell脚本来打印出找到该特定类的JARS文件的文件名? 问题答案: 就像是: 您可以这样包装: 然后将在当前目录下找到的所有jar文件中搜索该类