我认为这个方法可行...(递归地并从问题中去掉“连续”的要求,因为这似乎与问题提供的示例输出不匹配),而且OP提到了问题是:
给定一些正整数数组s,找到最长的子数组的长度,使得所有值的总和等于某个正整数k。
def longest_sum(input_list, index, num_used, target_number):
if target_number == 0:
return num_used
if index >= len(input_list):
return 0
used_1 = longest_sum(input_list, index + 1, num_used + 1, target_number - input_list[index])
used_2 = longest_sum(input_list, index + 1, num_used, target_number)
return max(used_1, used_2)
if __name__ == "__main__":
print(longest_sum([2, 1, 8, 3, 4], 0, 0, 6))
print(longest_sum([1, 2, 3], 0, 0, 4))
print(longest_sum([3, 1, 2, 1], 0, 0, 4))
print(longest_sum([1, 2, 7, 8, 11, 12, 14, 15], 0, 0, 10))
print(longest_sum([1, 2, 3], 0, 0, 999))
print(longest_sum([1, 1, 1, 1, 1, 1, 4], 0, 0, 6))
输出:
3
2
3
3
0
6
编辑 01:
如果您想获取使总和最长的列表,可以按照以下方式执行:
import copy
def longest_sum(input_list, used_list, target_number):
if target_number == 0:
return used_list
if not input_list:
return []
used_list_taken = copy.copy(used_list)
used_list_taken.append(input_list[0])
used_1 = longest_sum(input_list[1:], used_list_taken, target_number - input_list[0])
used_list_not_taken = copy.copy(used_list)
used_2 = longest_sum(input_list[1:], used_list_not_taken, target_number)
if len(used_1) > len(used_2):
return used_1
else:
return used_2
if __name__ == "__main__":
print(longest_sum([2, 1, 8, 3, 4], [], 6))
print(longest_sum([1, 2, 3], [], 4))
print(longest_sum([3, 1, 2, 1], [], 4))
print(longest_sum([1, 2, 7, 8, 11, 12, 14, 15], [], 10))
print(longest_sum([1, 2, 3], [], 999))
print(longest_sum([1, 1, 1, 1, 1, 1, 4], [], 6))
你将看到:
[2, 1, 3]
[1, 3]
[1, 2, 1]
[1, 2, 7]
[]
[1, 1, 1, 1, 1, 1]
提示 1: 我真的不知道如何在没有递归提供的快速回溯能力的情况下完成这个任务... 抱歉 :-(
提示 2: 如果这不是你想要的(我从要求中去掉了“连续”的要求),请告诉我,我会删除这个答案。
[1, 2, 3]
中没有连续的子数组,使得整数加起来等于4。 - bigblind[1, 2]
和[2, 3]
。只有当你认为数组是循环的时候,这个例子才有意义。也就是说,数组的最后一个元素与第一个元素相邻。此时,[3,1]
也是一个连续的子数组,加起来为4。 - bigblind