📜  门| GATE-CS-2017(套装2)|问题 17(1)

📅  最后修改于: 2023-12-03 15:28:45.721000             🧑  作者: Mango

门 | GATE-CS-2017(套装2)|问题 17

这是一道考验程序员逻辑思维及算法能力的题目。题目要求我们实现一个函数,该函数接收一个整数列表以及一个目标整数n作为参数,然后需要在这个整数列表中选择尽量少的数,使这些数的和等于目标整数n。如果无法找到这样的数,则返回False。

下面是一个示例输入输出:

>>> find_min_numbers_that_sum_n([1,2,3,4,5], 10)
[5, 3, 2]
>>> find_min_numbers_that_sum_n([1,2,7,8,9], 5)
False
思路

这是一个典型的动态规划问题,我们可以使用递归方法解决。我们可以考虑首先将给定列表排序,从最大的数开始减去,然后将剩余的列表递归地传递给自己,同时传递当前的和,直到和等于目标整数n或者剩余的列表为空。如果和等于目标整数n,则返回当前的列表。如果剩余的列表为空但是和不等于目标整数n,则返回False。

代码

下面是Python中的实现代码:

def find_min_numbers_that_sum_n(lst, target):
    lst = sorted(lst, reverse=True)
    if target == 0:
        return []
    if not lst or target < lst[-1]:
        return False
    for i in range(len(lst)):
        res = find_min_numbers_that_sum_n(lst[i+1:], target-lst[i])
        if res is not False:
            return [lst[i]] + res
    return False

该函数将输入列表排序,然后在for循环内递归地调用自身,并传入剩余列表和和减去当前数后的结果。如果递归返回结果不为False,则在结果前添加当前数。