给出一组元组(值,成本),是否存在一种算法来查找具有最小存储给定数量的成本的元组的组合

时间:2016-11-03 08:01:21

标签: algorithm

我有一组(值,成本)元组,它们是(2000000,200),(500000,75),(100000,20)

假设X是任何正数。

是否有算法可以找到元组合,这些组合的成本最低,可以存储X的值。

元组值的总和可以等于或大于给定的X

离。

给出x = 800000答案应为(500000,75),(100000,20),(100000,20),(100000,20)

给出x = 900000答案应为(500000,75),(500000,75)

给出x = 1500000答案应为(2000000,200)

我可以对此进行硬编码,但是设置和元组可能会发生变化,所以如果这可以用众所周知的算法替代,那就太棒了。

1 个答案:

答案 0 :(得分:2)

这可以通过dinamic编程来解决,因为你对元组的数量没有限制,并且能够提供更高的数量。

首先,您可以优化元组。如果一个大元组可以由具有相同或更低成本以及相等或更高值的较小元组替换,则可以删除更大的元组。 此外,未来的使用也很有成效,按价值/成本按降序排列优化集中的元组。如果价值/成本更高,元组会更好。

时间复杂度O(N * T),其中N是除以优化元组值的公因子(F)的数,并且T是优化元组集中的元组数。 内存复杂度O(N)。

设置大小为N的数组a,其中包含:

  • 以[i]成本解决i * F的最佳成本,0表示特殊情况“暂无解决方案”
  • 在[i] .tuple中导致最佳解决方案的元组

递归方案:

  • 函数将n作为单个参数 - 它提供了数字/ F表示启动,剩余所需值/ F表示重复调用
  • 如果填充n的数组a,则返回[n] .cost
  • 否则将current_cost设置为MAXINT
  • 从最佳到最差的每个元组尝试将其添加到解决方案中:
  • 如果value / F> = n,我们有一些解决方案,将元组成本与current_cost进行比较,如果更好,则更新[n] .cost和[n] .tuple
  • 如果值/ F < n,递归调用n值/ F并将成本与当前解决方案进行比较,更新当前解决方案和[n] .cost,a [n] .tuple(如果需要)
  • 毕竟,返回[n] .cost或抛出异常是没有解决方案

可以从每个步骤中的元组列表中检索元组列表,但是遍历.tuple。

可以将整体数组大小降低到最大值(元组值/ F),但是你必须为每个元素保存或多或少的完整解决方案,而不是一个最好的.tuple,你必须做“推拉窗”小心翼翼。 与许多其他动态编程算法一样,可以将递归从0变为n循环。