Python 找到值的子集的最佳近似值

Python 找到值的子集的最佳近似值,python,algorithm,nearest-neighbor,Python,Algorithm,Nearest Neighbor,我想得到一个算法,它可以为基于子集的值提供最佳近似值 以下是一个例子: N = 45 subset = [25,10,65,9,8] output: [25,10,9] 重要的一点是,算法必须给出最佳近似值(无论最终结果中的元素数量如何)。结果必须提供关联,该关联给出最近值的精确值(但不能超过初始值) 你知道一种算法可以用最少的时间成本做到这一点吗 非常感谢您的帮助。您不能在多项式时间内这样做(除非p=NP) 找出是否有一个和正好为N的子集显然比找到和最接近N的子集容易,前一个问题称为NP

我想得到一个算法,它可以为基于子集的值提供最佳近似值

以下是一个例子:

N = 45

subset = [25,10,65,9,8]

output: [25,10,9]
重要的一点是,算法必须给出最佳近似值(无论最终结果中的元素数量如何)。结果必须提供关联,该关联给出最近值的精确值(但不能超过初始值)

你知道一种算法可以用最少的时间成本做到这一点吗

非常感谢您的帮助。

您不能在多项式时间内这样做(除非p=NP) 找出是否有一个和正好为N的子集显然比找到和最接近N的子集容易,前一个问题称为NP完全问题


然而,伪多项式时间是可能的。事实上,如果我们将
子集中的值
都作为转换为背包的权重值,那么您的问题正好等于。这个0/1背包问题有一个动态规划解决方案,它在
O(nW)
中运行,其中
n
子集
中的项数,
W
是目标,即代码中的
n

以下代码适用于短列表。但是,对于较长的列表,性能将显著降低:

import itertools
def closest(my_list, my_number):
    l=[]
    for i in range(1,len(my_list)+1):
        for k in itertools.combinations(my_list, i):
            l.append([k, sum(k)])
    l=[i for i in l if i[1]<=my_number]
    l.sort(key=lambda x:x[1])
    return l[-1]
print(closest(subset, 45)[0], closest(subset, 45)[1])

你试过什么?所有的数字都是正数吗?是的,所有的数字都是正数。你的意思是,总数最接近但不大于给定数字的子集?如果有很多可能的子集呢?我的意思是,如果这个数字是45,那么发现的关联不能大于45。如果有许多可能的子集给出最佳近似值,我们只取其中一个。您的意思是输出列表中的值之和必须尽可能接近N吗?谢谢。我试着理解你所做的。什么是“itertools.compositions”?好的,我知道了!但是在“itertools.combinations(my_list,i)”一行中,它应该是“i+1”否?它是一个返回列表的所有组合的函数。检查这里:是的,你是对的,我更改了代码,这样它将循环1到len(我的列表)(包括)好的,谢谢!我试图找出组合的复杂度,得到这个算法的总复杂度。
(25, 10, 9) 44