Если вы можете использовать любые структуры данных, вы можете просто рассматривать это как проблему с рюкзаком и отслеживать, сколько чисел вы использовали в дополнение к сумме.
numbers = [xxx]
buckets = [[0,0] for x in range(MAX_SUM)]
buckets[0][0] = 1;
for number in numbers:
for bucketi in range(MAX_SUM):
if buckets[bucketi][0] == 1 and buckets[bucketi][1] < k:
buckets[bucketi+number][0] = 1;
buckets[bucketi+number][1] = buckets[bucketi][1] + 1;
Вот также попытка понять, к чему стремился @Patrick, я не уверен в пределе, но это интересная идея.
def go_(numbers, range_bottom,range_top,sum_target,k,min_v,max_v,nums):
min_v_,max_v_,res_ = go(numbers, range_bottom,range_top,sum_target-sum(nums),k)
min_v = min(min_v,min_v_)
max_v = max(max_v,max_v_)
if len(res_) > 0:
newres = [x for x in res_]
newres = newres+nums
return [0,0,newres]
return [min_v,max_v,res_]
def go(numbers, range_bottom,range_top,sum_target,k):
if sum_target==0 and k == 0:
return [0,0,['-']];
elif sum_target<0 or k==0 or range_bottom == range_top:
return [sum_target,sum_target,[]]
min_v = 666; max_v = -666;
if range_top-range_bottom>1:
min_v ,max_v, res_ = go_(numbers, range_bottom+1, range_top-1, sum_target,k-2,min_v,max_v,[numbers[range_bottom],numbers[range_top-1\
]])
if len(res_):
return [0,0,res_];
if not ( min_v<0 and max_v<0 ):
min_v ,max_v, res_ = go_(numbers, range_bottom+1, range_top, sum_target ,k,min_v,max_v ,[])
if len(res_):
return [0,0,res_];
if not ( min_v>0 and max_v>0 ):
min_v ,max_v, res_ = go_(numbers, range_bottom, range_top-1, sum_target,k,min_v,max_v,[])
if len(res_):
return [0,0,res_];
return [min_v,max_v,res_]