所以我有一个带键的词典:value(元组)。像这样的东西。 {“name”:( 4,5),....}在哪里 (4,5)代表两个类别(cat1,cat2)。给定第二类的最大数量,我想找到字典条目的最佳组合,以使第一类最大化或最小化。
例如,如果maxCat2 = 15,我想从字典中找到一些条目组合,这样,当我将每个条目中的cat2值加在一起时,我不到15岁。可能有很多这样的条件。在这些可能性中,我想选择一个当我为每个条目添加cat1的值时,它比任何其他可能性都大。
我考虑编写一个算法来获取字典中条目的所有排列,然后查看每个条目是否符合maxCat2标准,然后看看哪一个给了我最大的总cat1值。如果我有20个条目,那意味着我会检查20个!组合,这是一个非常大的数字。我能做些什么来避免这种情况吗?谢谢。
答案 0 :(得分:1)
正如Jochen Ritzel所指出的,这可以看作是knapsack problem的一个实例。
通常,您有一组具有“权重”(在您的示例中为“第二类”)和“值”(或“成本”,如果它是最小化问题)的对象。
问题在于挑选对象的子集,使其“值”的总和最大化/最小化,受限于权重的总和不能超过指定的最大值。
虽然问题一般是难以处理的,但如果对权重之和的最大值的约束是固定的,则存在使用dynamic programming或memoization的多项式时间解决方案。
非常广泛地说,这个想法是定义一组值
C ij 表示仅考虑第一个 i 对象可获得的最大总和(“值”),其中总重量(选择的子集)不能超过 j 。
这里有两种可能的选择来计算 C ij 。
元素 i 包含在子集中,然后
C ij = value i + C i-1,j-重量<子> I 子> 子> 的
或元素 i 不在所选对象的子集中,所以
C ij = C i-1,j
需要挑选两者中的最大值。
如果 n 是元素数且 w 是最大总重量,则答案最终在 C nw 中