不同的被加数问题 - 贪心算法 (Python)
Different Summands problem - greedy alogrithm (Python)
我正在尝试设计一个名为“distinct_summands”的函数,它接受一个正整数 n,输出一个包含 k 个不同整数 a1,...,ak 的列表,使得 a1+...+ ak= n 并且 k 尽可能大。
部分测试用例示例如下:distinct_summands(8)=[1,2,5], distinct_summands(2)=[2], distinct_summands (14)=[1, 2, 3, 8]。我自己测试了 n=1,2,3...,100K 的代码。到目前为止我没有发现任何错误。但是,当我将代码提交给黑盒代码测试器时,出现“超出索引”错误。
我尝试了我所知道的一切来找出问题所在。但我仍然不知道出了什么问题。我在下面附上了我的代码。谁能告诉我我做错了什么?
def distinct_summands(n):
if n <=2:
return [n]
remainder = n
number_list = list(range(1, n+1))
prev_pos, curr_pos = 0, 0
summands = []
while remainder > number_list[prev_pos]:
remainder = remainder - number_list[curr_pos]
prev_pos = curr_pos
summands.append(number_list[prev_pos])
if remainder > 2* number_list[curr_pos+1]:
curr_pos += 1
else:
curr_pos = remainder -1
return summands
如果 n 很大,那么 number_list = list(range(1, n+1))
需要大量内存(可能是 out of index
错误的原因)。但是您使用 number_list
数组仅获取元素,所以我认为您可以将 number_list[index]
替换为 index + 1
并解决您的问题:
def distinct_summands(n):
if n <= 2:
return [n]
remainder = n
prev_pos, curr_pos = 0, 0
summands = []
while remainder > prev_pos + 1:
remainder = remainder - (curr_pos + 1)
prev_pos = curr_pos
summands.append(prev_pos + 1)
if remainder > 2 * (curr_pos + 2):
curr_pos += 1
else:
curr_pos = remainder - 1
return summands
我正在尝试设计一个名为“distinct_summands”的函数,它接受一个正整数 n,输出一个包含 k 个不同整数 a1,...,ak 的列表,使得 a1+...+ ak= n 并且 k 尽可能大。
部分测试用例示例如下:distinct_summands(8)=[1,2,5], distinct_summands(2)=[2], distinct_summands (14)=[1, 2, 3, 8]。我自己测试了 n=1,2,3...,100K 的代码。到目前为止我没有发现任何错误。但是,当我将代码提交给黑盒代码测试器时,出现“超出索引”错误。
我尝试了我所知道的一切来找出问题所在。但我仍然不知道出了什么问题。我在下面附上了我的代码。谁能告诉我我做错了什么?
def distinct_summands(n):
if n <=2:
return [n]
remainder = n
number_list = list(range(1, n+1))
prev_pos, curr_pos = 0, 0
summands = []
while remainder > number_list[prev_pos]:
remainder = remainder - number_list[curr_pos]
prev_pos = curr_pos
summands.append(number_list[prev_pos])
if remainder > 2* number_list[curr_pos+1]:
curr_pos += 1
else:
curr_pos = remainder -1
return summands
如果 n 很大,那么 number_list = list(range(1, n+1))
需要大量内存(可能是 out of index
错误的原因)。但是您使用 number_list
数组仅获取元素,所以我认为您可以将 number_list[index]
替换为 index + 1
并解决您的问题:
def distinct_summands(n):
if n <= 2:
return [n]
remainder = n
prev_pos, curr_pos = 0, 0
summands = []
while remainder > prev_pos + 1:
remainder = remainder - (curr_pos + 1)
prev_pos = curr_pos
summands.append(prev_pos + 1)
if remainder > 2 * (curr_pos + 2):
curr_pos += 1
else:
curr_pos = remainder - 1
return summands