这是发布here的问题的一个子集。
给定一组体积为B={x1, x2, ..., xn}
的桶和一组具有体积为V={v1, v2, ..., vn }
的液体的样品瓶,证明桶的数量可以填充样品瓶的内容的最佳方法是什么?假设必须将小瓶倒入一个桶中。允许溢出。
这里有一些明显的不变量,即桶|B|
的基数必须小于或等于样品瓶|V|
的基数,并且桶Sum(B)
的组合体积必须小于或等于样品瓶Sum(V)
这是众所周知的计算问题吗?如果可以的话,可以用C#来表达一个简单的LINQ解决方案吗?
我觉得这是Eric Lippert会写博客的内容; - )。
答案 0 :(得分:3)
考虑这个问题的一个例子,你有两个相同大小的桶,Sum(B)= Sum(V)。这意味着您需要在两个桶上均匀分配样品瓶,否则一个桶会溢出,而另一个桶则不会剩余。这被称为partition problem,并且已知它是NP完全的。
修改强> 当然,NP完全性并不意味着问题无法解决,只是运行时间将是输入大小的指数(在这种情况下,最大桶大小的log2)。
如果我们能找到填充桶所需的最少量液体(包括溢出),解决问题的方法很简单,每个桶都要这样做,并在每个桶后从可用样品瓶中取出用过的样品瓶
我们可以通过使用动态编程来实现: