【问题标题】:Vartiation of the knapsack背包的变化
【发布时间】:2020-09-26 13:59:04
【问题描述】:

您的工作是将n 对象装入盒子中。每个盒子可以有一件或两件物品,盒子里物品的总重量最大可以是x。最少要装几箱?

我无法弄清楚这里的问题是背包还是其他东西......

对于我有的普通背包

def knapsack(x, wt, values, n):
    if n == 0 or x == 0 : 
        return 0
    if (wt[n-1] > x): 
        return knapsack(x, wt, values, n-1)  
    else: 
        return max(val[n-1] + knapsack(x-wt[n-1], wt, val, n-1), knapsack(x, wt, val, n-1))

但我不确定如何修改它?此外,我似乎在这里寻找最小值而不是最大值。这也可能是子集和的一些变体吗?

【问题讨论】:

    标签: python algorithm dynamic-programming heuristics


    【解决方案1】:

    这里不需要背包,因为所有物品都必须打包。您也不需要使用垃圾箱包装,因为您的箱子仅限于 1 或 2 个物品。贪心算法要简单得多。采取以下措施:

    1. 将对象从最重到最轻排序
    2. 取最重的对象为H,最轻的对象为L。如果H + L > x,则没有其他对象H可以打包,必须自己打包。否则将HL 打包在一起会最小化盒子,因为将L 与任何其他对象放在一起不会进一步减少盒子的数量(作为证明,请查看是否可以将其他对象与L 打包但不能任何其他对象,则H 也不能与该其他对象打包)。
    3. 重复直到所有对象都被打包

    这是一个 O(nlog(n)) 解决方案,通过限制每个盒子的项目数量成为可能。如果物品数量没有限制,那么您将不得不求助于垃圾箱包装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2019-02-08
      • 1970-01-01
      • 2016-05-07
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多