last = []
left = []
def sort_dict(last): #返回字典最小value对应的item
res = dict()
values = list(last.values())
keys = list(last.keys())
min = [0]
for index in range(len(values)):
if values[index] < values[min[0]]:
min.clear()
min.append(index)
elif values[index] == values[min[0]]:
min.append(index)
for index in min:
key = keys[index]
res[key] = last[key]
return res
def max_num(a, n): # 和不大于n的最大个数元素
a.sort()
s = 0
index = 0
if n < a[0]:
return -1
while s < n and index <len(a):
s += a[index]
index += 1
return index
def sub_list(a, index, n): # 生成元素个数为n的子数组
if index == n:
res = a[:n]
res.sort()
global last
if res not in last:
last.append(res)
left_0 = a[n:]
left_0.sort()
global left
if left_0 not in left:
left.append(left_0)
else:
for i in range(index, len(a)):
a[i], a[index] = a[index], a[i]
sub_list(a, index + 1, n)
a[index], a[i] = a[i], a[index]
def main(a, n):
result = dict()
mx = max_num(a, n)
if mx == len(a):
result[str(a)] = n - sum(a)
return result
if mx ==-1:
return {}
for i in range(1, mx+1):
sub_list(a, 0, i)
global last
global left
for i in range(len(last)):
if sum(last[i]) + min(left[i]) > n and sum(last[i]) <= n: # 筛选标准
result[str(last[i])] = n - sum(last[i])
else:
pass
return sort_dict(result)
a= [1,2,3,4,5,6,7,8,9,10]
n=120
res = main(a, n)
print(res)
n=0
res = main(a, n)
print(res)
n=14
res = main(a, n)
print(res)
结果:
{’[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]’: 65}
{}
{’[4, 10]’: 0, ‘[5, 9]’: 0, ‘[6, 8]’: 0, ‘[1, 3, 10]’: 0, ‘[1, 4, 9]’: 0, ‘[1, 5, 8]’: 0, ‘[1, 6, 7]’: 0, ‘[2, 3, 9]’: 0, ‘[2, 4, 8]’: 0, ‘[2, 5, 7]’: 0, ‘[3, 4, 7]’: 0, ‘[3, 5, 6]’: 0, ‘[1, 2, 3, 8]’: 0, ‘[1, 2, 4, 7]’: 0, ‘[1, 2, 5, 6]’: 0, ‘[1, 3, 4, 6]’: 0, ‘[2, 3, 4, 5]’: 0}