我有很多食物成分,每种都含有蛋白质,碳水化合物和脂肪。 e.g:
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参数。
e.g。
CombineFoodsBasedOnMacro(45, 40, 20)
可接受的'回答'可能是:
4 * Food1 + 1 * Food3
这相当于总数:
P = 44, C = 40, F = 17
我的问题是:我可以使用什么算法进行此类计算/近似?
答案 0 :(得分:2)
这个问题是NP-Hard ,几乎是多重集合而不是集合的Set Cover Problem的泛化,因此没有已知的多项式解决方案(并且大多数情况下)相信这样的解决方案不存在。)
您可以使用integer linear programming尝试解决此问题,例如:
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)不是变量,所以它适用于整数线性编程。