给定一个整数数组a,两个数字N和M,返回一N组整数,a使每个组的总和为M。
a
N
M
例如,说:
a = [1,2,3,4,5]
N = 2
M = 5
然后,该算法可能返回[2, 3], [1, 4],[5], [2, 3]或者可能返回其他算法。
[2, 3], [1, 4]
[5], [2, 3]
我在这里可以使用哪些算法?
编辑:
我不知道这个问题是NP问题。因此,如果我提供有关特定场景的更多详细信息,可能会有所帮助:
因此,我试图创建一个“匹配”应用程序。给定团队N数量和每个团队的玩家数量M,应用程序将侦听客户的请求。每个客户请求都会提供该客户代表的许多玩家。因此,如果我需要由5名球员组成的2支球队,那么如果5个客户发送请求,每个请求分别代表1、2、3、4、5个球员,那么我的应用程序应该在客户[1, 4]和客户之间产生对决[2, 3]。它还可能会在[1, 4]和之间产生匹配[5]。我不在乎
[1, 4]
[2, 3]
[5]
一种暗示是,任何代表多于M或少于0玩家的客户都是无效的。希望这可以简化问题。
0
这是我自己的使用动态编程的Python解决方案。这里给出算法。
def get_subset(lst, s): '''Given a list of integer `lst` and an integer s, returns a subset of lst that sums to s, as well as lst minus that subset ''' q = {} for i in range(len(lst)): for j in range(1, s+1): if lst[i] == j: q[(i, j)] = (True, [j]) elif i >= 1 and q[(i-1, j)][0]: q[(i, j)] = (True, q[(i-1, j)][1]) elif i >= 1 and j >= lst[i] and q[(i-1, j-lst[i])][0]: q[(i, j)] = (True, q[(i-1, j-lst[i])][1] + [lst[i]]) else: q[(i, j)] = (False, []) if q[(i, s)][0]: for k in q[(i, s)][1]: lst.remove(k) return q[(i, s)][1], lst return None, lst def get_n_subset(n, lst, s): ''' Returns n subsets of lst, each of which sums to s''' solutions = [] for i in range(n): sol, lst = get_subset(lst, s) solutions.append(sol) return solutions, lst # print(get_n_subset(7, [1, 2, 3, 4, 5, 7, 8, 4, 1, 2, 3, 1, 1, 1, 2], 5)) # [stdout]: ([[2, 3], [1, 4], [5], [4, 1], [2, 3], [1, 1, 1, 2], None], [7, 8])