【问题标题】:Python Subset Sum Problem for Given Length of Elements给定元素长度的 Python 子集和问题
【发布时间】:2019-03-03 03:53:19
【问题描述】:

对于给定的集合、元素的总和和长度,
我想获取集合是否满足条件的布尔值

例如...

Input : set = [18,0,2,20], sum = 20, length = 2 <br>
Output : True (subset [18,2] satisfy the sum=20 for given length 2)

Input : set = [18,0,2,20], sum = 22, length = 1 <br>
Output : False

如果有给定的长度限制,我该如何解决这个问题?
(如果没有长度条件,我可以轻松解决: subset-sum-problem)

def isSubsetSum(set, n, sum):
    if sum == 0:
        return True
    if (sum != 0) and (n == 0):
        return False
    if (set[n-1] > sum):
        return isSubsetSum(set,n-1,sum)
    # (a) including the last element
    # (b) excluding the last element
    # Not "AND", But "OR" !!!!!
    return isSubsetSum(set,n-1,sum) or isSubsetSum(set,n-1,sum-set[n-1])

【问题讨论】:

    标签: python subset subset-sum


    【解决方案1】:

    如果允许您使用导入的模块,itertools 有一个组合功能可以让这变得非常简单:

    from itertools import combinations
    set    = [18,0,2,20]
    total  = 20
    length = 2
    result = [ c for c in combinations(set,length) if sum(c) == total ]
    if result: 
      print("True, subset ",result[0],"satisfies the sum", total, "given length",length)
    else: 
      print("False")
    

    如果您需要它是一个递归函数,请考虑对于集合中的每个元素X,如果您可以在总计sum-X 的后续元素中找到N-1 元素的子集,那么您有一个解决方案为sum/length=N

    例如:

    def subSum(numbers,total,length):
      if len(numbers) < length or length < 1:
        return []
      for index,number in enumerate(numbers):
        if length == 1 and number == total:
          return [number]
        subset = subSum(numbers[index+1:],total-number,length-1)
        if subset: 
          return [number] + subset
      return []
    

    【讨论】:

      【解决方案2】:

      使用itertools.combinations:

      from itertools import combinations
      
      inp = [18,0,2,20]
      length = 2
      sum_ = 20
      
      def isSubsetSum(data, length, sum_):
          data = [i[0]+i[1] for i in combinations(data,length)]
          if sum_ in data:
              return True
          return False
      
      print(isSubsetSum(inp,length, sum_))
      

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 2018-08-24
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        相关资源
        最近更新 更多