使用LINQ可以使用一组值来满足一组要求的证明

时间:2013-05-24 20:53:48

标签: algorithm linq combinatorics set-theory

这是发布here的问题的一个子集。

给定一组体积为B={x1, x2, ..., xn}的桶和一组具有体积为V={v1, v2, ..., vn }的液体的样品瓶,证明桶的数量可以填充样品瓶的内容的最佳方法是什么?假设必须将小瓶倒入一个桶中。允许溢出。

这里有一些明显的不变量,即桶|B|的基数必须小于或等于样品瓶|V|的基数,并且桶Sum(B)的组合体积必须小于或等于样品瓶Sum(V)

的总体积

这是众所周知的计算问题吗?如果可以的话,可以用C#来表达一个简单的LINQ解决方案吗?

我觉得这是Eric Lippert会写博客的内容; - )。

1 个答案:

答案 0 :(得分:3)

考虑这个问题的一个例子,你有两个相同大小的桶,Sum(B)= Sum(V)。这意味着您需要在两个桶上均匀分配样品瓶,否则一个桶会溢出,而另一个桶则不会剩余。这被称为partition problem,并且已知它是NP完全的。

修改 当然,NP完全性并不意味着问题无法解决,只是运行时间将是输入大小的指数(在这种情况下,最大桶大小的log2)。

如果我们能找到填充桶所需的最少量液体(包括溢出),解决问题的方法很简单,每个桶都要这样做,并在每个桶后从可用样品瓶中取出用过的样品瓶

我们可以通过使用动态编程来实现:

  • 对于给定的桶b,考虑所有大小为0到桶(b)的桶。
  • 0号桶显然不需要液体
  • 对于每个尺码s,找一个样品瓶v,以便:
    • s-volume(v)的解决方案不使用v
    • (用于s体积(v)的液体量)+体积(v)被最小化
  • 在这一切结束时,您将使用用于填充桶b的样品瓶。然后,您只需从可用样品瓶中取出那些样品,然后转到下一个样品桶。