【问题标题】:Combining numbers in the most efficient way以最有效的方式组合数字
【发布时间】:2019-07-18 08:31:16
【问题描述】:

我正在寻找一种将数据集与数字组合在一起的方法,以使组合的总数最小化。约束是每个组合的总和必须小于某个数字。

问题示例如下所示:

数据集[11, 10, 19, 2, 12]

约束:组合=< 21和每个数字只能使用一次的总和。

手动可以发现最优组合是:[11, 10], [19, 2], [12]

目标:尽量减少组合数

但是,对于大型数据集,手动操作是不可能的。

我已经研究了使用、排列和线性方程组的可能性,但老实说,我真的不知道如何解决这个问题。有人可以给我一些想法吗?提前谢谢你。

【问题讨论】:

  • 到目前为止你尝试过什么代码?有没有额外的限制?是什么让您建议的手动组合比例如更好? [11, 10], [12, 2], [19]?顺序是否应该保持不变?子列表中是否允许超过 2 个项目?
  • 这个问题完全可以用linear programming技术解决,但是它们的高效实现几乎是微不足道的。

标签: python python-3.x optimization combinations


【解决方案1】:

在没有进一步说明的情况下,以下算法会产生预期的输出:

def split_max(items, max_sum):
    result = []
    partial = []
    for item in items:
        if sum(partial) < max_sum:
            partial.append(item)
        else:
            result.append(partial)
            partial = [item]
    if partial:
        result.append(partial)
    return result


split_max([11, 10, 19, 2, 12], 21)
# [[11, 10], [19, 2], [12]]

(请注意,如果允许项目以不同的顺序出现,则不一定会产生最小数量的子列表)。

【讨论】:

    【解决方案2】:

    所有你需要itertools.combinations

    >>> from itertools import combinations
    >>> myList = [11,10,19,2,12]
    >>> [i for i in combinations(myList, 2) if sum(i) <= 21] # first will be your iterable, second is the position here you need combination for 2 position
    [(11, 10), (11, 2), (10, 2), (19, 2), (2, 12)]
    >>> 
    

    【讨论】:

    • 这个问题还有更多内容。
    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多