使用动态编程最小化功能

时间:2015-04-23 15:09:36

标签: algorithm dynamic-programming

如何最小化函数y 1 2 + y 2 2 + ... + y n 2 约束y 1 * y 2 * ... * y n = C; y 1 ,y 2 ,...,y n > 0使用动态编程?我试图解决这个问题,但我不知道如何创建一个循环函数。

2 个答案:

答案 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.

如果我们采用较少的因素,则总和会更大:

  • y 1 = 60,然后sum = 60 2 = 3600。
  • y 1 = 5,y 2 = 6,则sum = 5 2 + 6 2 = 61。
  • y 1 = 3,y 2 = 4,y 2 = 5,则sum = 3 2 + 4 2 + 4 5 = 50.

非正式的理由 - 分割产品总是有益的:
假设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