如何最小化函数y 1 2 + y 2 2 + ... + y n 2 约束y 1 * y 2 * ... * y n = C; y 1 ,y 2 ,...,y n > 0使用动态编程?我试图解决这个问题,但我不知道如何创建一个循环函数。
答案 0 :(得分:1)
你需要考虑如何将问题减少到更小的问题"
y1,y2,....,yi
在上文中,您将问题从y1,...,y_{i-1}
减少到y_i
,并检查D(0,0) = 0
D(i,0) = Infinity i>0
的所有可能分配 - 并从中选择最佳分配。
基本条款将是:
i,c
假设D(i,c) = Infinity if c is not natural
是整数,您可以使用这些递归公式执行自上而下或自下而上的DP解决方案。 (可能需要添加{{1}}
答案 1 :(得分:0)
基于您的问题和给出的澄清,我认为动态编程不是必需的。最小的解决方案是选择y 1 ,...,y n 作为c的主要因子(重复)。
示例:给定c = 60,我们让y 1 = 2,y 2 = 2,y 3 = 3,y < sub> 4 = 5.
然后总和为y 1 2 + y 2 2 + y 3 < sup> 2 + y 4 2 = 4 + 4 + 9 + 25 = 42.
如果我们采用较少的因素,则总和会更大:
非正式的理由 - 分割产品总是有益的:
假设c = ab,a和b≥2
然后c 2 = a 2 b 2 。 (a 2 b 2 > 2a 2 )和(a 2 b 2 &gt; 2b 2 )都是正确的
加上这些不等式,我们得到2a 2 b 2 &gt; 2a 2 + 2b 2
因此,c 2 = a 2 b 2 &gt; a 2 + b 2 。