使用键值对的子集求和问题 - python

Subset sum problem using key value pairs - python

我有一个算法可以输出一个子集,该子集的总和值尽可能接近整数 s

from itertools import combinations

products = {
    "Apple": 5,
    "Pear": 4,
    "Banana": 8,
    "Strawberry": 7,
    "Watermelon": 9,
    "Lemon": 6,
}


def closest_subset(s, nums):
    return min((
        c
        for i in range(1, len(nums) + 1)
        for c in combinations(nums, i)
    ), key=lambda x: abs(s - sum(x)))


print(closest_subset(11, products.values()))

# Output: (5, 6)

相反,我想从字典中输出项目,如下所示:

# Desired output
{
    "Apple": 5,
    "Lemon": 6,
}

如何修改我的代码来实现此目的?

您可以修改它,将字典项而不是值传递给函数。为了澄清这一点,我将代码中的 nums 替换为 items。该函数的其余部分基本上以相同的方式工作,但组合为您提供了包含键和值的元组组合。 因此,您必须稍微调整您的 min 函数 key,使其仅考虑每个元组的第二个值 v2,即实际金额。然后,min 函数 returns 元组 pof 键和值对的元组,然后您可以在返回之前将其转换为字典。

from itertools import combinations

products = {
    "Apple": 5,
    "Pear": 4,
    "Banana": 8,
    "Strawberry": 7,
    "Watermelon": 9,
    "Lemon": 6,
}


def closest_subset(s, items):
    return dict(min((
        c
        for i in range(1, len(items) + 1)
        for c in combinations(items, i)
    ), key=lambda x: abs(s - sum([v2 for v1, v2 in x]))))


print(closest_subset(11, products.items()))

# Output: {'Apple': 5, 'Lemon': 6}