我有一大套食物成分,每一种都有蛋白质、碳水化合物和脂肪的特性。例如。:
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)不是一个变量,所以对于整数线性规划来说是很好的。