我有一大套食物成分,每一种都有蛋白质、碳水化合物和脂肪的特性。例如。:

Food Name   P    C    F
Food1       10   5    3
Food2        3   10   8
Food3       4    20   5

我需要写一个函数,它看起来像:
private List< Food > CombineFoodsBasedOnMacro(p, c, f)

这个函数应该选择并组合两种不同数量的食物,这样当我们组合所选食物数量的P,C和F时,它们非常接近传递的P,C,F参数。
例如
CombineFoodsBasedOnMacro(45, 40, 20)

可接受的“答案”可能是:
4 * Food1 + 1 * Food3

总计:
P = 44, C = 40, F = 17

我的问题是:我可以用什么算法来计算/近似?

最佳答案

这个问题是NP-难的,并且几乎是对多集而不是集合的“AA>”的推广,因此对于问题没有已知的多项式解(并且大多数人相信不存在这样的解)。
您可以使用Set Cover Problem来尝试解决此问题,例如:

minimize Sum( x_s) (number of sets), s.t.:
Sum(x_s | for all sets ) #p(s)*x_s >= p // repeat for c,f
x_s = 0 || x_s = 1

注意p(s)不是一个变量,所以对于整数线性规划来说是很好的。

10-06 13:51