我将如何编辑此贪婪函数以求和?

时间:2018-11-01 20:27:28

标签: python python-2.7 greedy

因此,我想创建一个接受int和数组A的函数,然后返回加到s的元素A的数组。如果没有子集,则应返回最接近s的值。

例如:

A = [12, 79, 99, 91, 81, 47]
s = 150

会返回:

[12, 91, 47]

12 + 91 + 47150

以下是我到目前为止的内容。我在做什么错了?

def closest(s, A):
    if s == 0:
        return 0
    for i in range(len(A)):
        if A[i] <= s:
            return 1 + closest(s - A[i], A)

2 个答案:

答案 0 :(得分:0)

这是

之前的答案

Find all combinations of a list of numbers with a given sum

在您的情况下,代码为:

import itertools

def itersum(nums, target):

    result = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target]
    if result != target:
       for j in range(target):
           result1 = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target + j]
           result2 = [seq for i in range(len(nums),0,-1) for seq in itertools.combinations(nums,i) if sum(seq) == target - j]
           if (len(result1) + len(result2)) > 0:
               result = result1 if result1 > result2 else result2
               break            
    return result

A = [12, 79, 99, 91, 81, 44]

s = 150

itersum(A, s)

答案 1 :(得分:0)

该函数应该返回一个列表列表,因为可能会有多个组合加起来得出给定的总和:

 (async function() {
    for(let i = 0; i < 1000; i++)
      await screenshot(i);
 })();

这样:

 Promise.all(Array.from({ length: 1000 }, (_, i) => screenshot(i)))
  .then(/*...*/);

返回:

def closest(s, A):
    if s == 0:
        return [[]]
    o = []
    for i, n in enumerate(A):
        if n <= s:
            for c in closest(s - n, A[i + 1:]):
                o.append([n] + c)
    return o

那:

closest(150, [12, 79, 99, 91, 81, 47])

返回:

[[12, 91, 47]]