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

正在寻找修复算法的方法。用动态规划实现组合求和Ⅱ

柯昱
2023-03-14

基本上,我正在尝试使用动态编程在python中实现combination sum II,我的目标是创建一个时间复杂度不为O(2^n)的程序,但我遇到了很多问题,在任何地方都找不到解决方案。下面是我迄今为止得到的代码,但它似乎没有给出任何输出。

预期输出:[1,2,3],[1,5],[2,4]

实际产出:字面上没有

arr = [1,2,3,4,5]
def combinationSum(candidates, target):

    counts = [0] * (target + 1)
    for elem in candidates:
        if elem <= target:
            counts[elem] += 1
            
    numbers = []

    a = 1
    while a <= target:
        if counts[a] != 0:
            numbers.append(a)
        a += 1

    subsets = [[]] * (target+1)
    smallTarget = numbers[0]
    while smallTarget <= target:
        subset = []

        for i in numbers:
            if i > smallTarget:
                break
            if (((i == smallTarget) or (i <= smallTarget/2)) != True) :
                continue

            mList = subsets[smallTarget - i]

            for j in mList:
                if len(j) == 0 or j[0] >= i:

                    count = counts[number]

                    for k in j:

                        if k == i :
                            count -= 1
                    if count != 0:
                        tList = []

                        tList.append(i)

                        for l in j:
                            tList.append(l)
                            
                        subset.add(tList)
        subsets[smallTarget] = subset
        smallTarget+=1
    return subsets[target]


for i in combinationSum(arr, 6):
    print(i)

共有1个答案

宓毅庵
2023-03-14

若要修复代码不打印答案的问题,请在循环之前将一个空子集相加为0:

subsets[0].append([])

创建子集后。

然而,这段代码有几个问题,从变量名到重复工作。看看其他几种解决子集求和问题的方法,或者只搜索“子集求和”,看看您的问题的许多现有解决方案。

 类似资料:
  • 我已经实现了代码来输出从输入数组的元素中获得目标和的所有不同的唯一可能性。例如,给定

  • 主要内容:动态规划算法的实际应用动态规划算法解决问题的过程和分治算法类似,也是先将问题拆分成多个简单的小问题,通过逐一解决这些小问题找到整个问题的答案。不同之处在于,分治算法拆分出的小问题之间是相互独立的,而动态规划算法拆分出的小问题之间相互关联,例如要想解决问题 A,必须先解决问题 B 和 C。 《贪心算法》一节中,给大家举过一个例子,假设有 1、7、10 这 3 种面值的纸币,每种纸币使用的数量不限,要求用尽可能少的纸币拼凑

  • 我目前正在学习动态编程,我无法解决这个问题。有人能给我一个算法吗?:考虑一个有向图G=(V,E),其中每个边都标有一个字母Sigma的字符,我们指定一个特殊的顶点s作为开始顶点,另一个f作为最后顶点。我们说G接受一个字符串a=a1a2。如果有一条从s到f的n条边的路径,其标号拼写为序列a。设计了一个O((V+E)n)动态规划算法来确定a是否被G接受。

  • 我问了这个问题 求和的方法数S与N个数求和的所有方法从给定集合中求和给定数(允许重复) 不太明白那里的答案, 我写了两种方法来解决一个问题: 用数字N(允许重复)找出求和S的方法数 sum=4,number=1,2,3答案是1111、22、1122、31、13、1212、2112、2212 在一种方法中我使用记忆,而在另一种方法中我不使用。不知怎的,在我的机器中,记忆版本的运行速度比非记忆版本慢得

  • 我正在为动态编程编写一些复习材料。我需要提出如何划分子问题,计算出基本情况,并提出递归公式。 给定 n 个正整数 a1,a2,...,an、一个数字 k 和一个目标 W,我们希望选择一个子集 T,其总和恰好是 k 个元素,其总和最接近 W。每个元素只能选择一次。定义一个具有 3 个参数的子问题(即 C[x,y,z] = ...)。 我只处理过几个动态编程示例,从未处理过定义子问题时需要3个参数的示

  • 我正在探索动态编程设计方法如何与问题的潜在组合属性相关联。 为此,我正在研究硬币兑换问题的典型实例:让和