【问题标题】:How can we algorithmicaly calculate the box with maximum possible volume?我们如何通过算法计算最大可能体积的盒子?
【发布时间】:2012-12-05 22:04:32
【问题描述】:

约翰尼需要为他的物理课项目制作一个矩形框。他买了 P cm 的铁丝和 S cm2 的特种纸。他想用所有的电线(12 个边)和纸(6 个边)来制作盒子。

约翰尼能做的最大盒子体积是多少?

输入

第一行包含 t,测试用例的数量(大约 10 个)。然后是 t 个测试用例。 每个测试用例在一行中包含两个整数 P 和 S (1 ≤ P ≤ 40000, 1 ≤ S ≤ 20000)。您可以假设对于给定的输入案例总是存在一个最优解。

输出

对于每个测试用例,打印一个实数,它是 Johnny 可以制作的最大盒子体积,四舍五入到小数点后两位。

示例输入:

2
20 14
20 16

输出:

3.00
4.15

输出细节

第一种情况:最大盒子的尺寸可能是3、1和1。

第二种情况:最大盒子的尺寸可能是7/3、4/3和4/3。

这是来自 www.codechef.com 的练习题。名称是“The Best box”。我不想要这个的代码。我只想知道我们如何解决这个问题?任何帮助,将不胜感激。提前致谢。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    您实际上是在尝试解决:

    maximize V=a*b*c
    
    subject to constraints:
    
    4a+4b+4c = P 
    2ab + 2ac + 2bc = S
    

    这是一个可以使用 lagrange multipliers 解决的数学问题(将其余部分的开发留给您作为练习 - 它主要是技术性的,如果小心缓慢地完成,应该不是问题)。

    【讨论】:

    • 我也试过这个方法。但我想应用拉格朗日乘数不是通过计算机解决问题的好主意。
    • @KunalSuri 绝对是——这是获得解决方案的最快方法,也是最简单的方法。您当然可以尝试反复摆弄 a/b/c 以获得最大值,但这几乎肯定会花费更长的时间来运行,得到不准确的答案,甚至可能比找到解决方案的形式更难编码提前一点数学。
    【解决方案2】:

    只是为了好玩,这是一个无需微积分的答案。

    考虑约束:

    4a+4b+4c = P 
    2ab + 2ac + 2bc = S
    

    我们可以将它们改写为:

    a+b+c = P/4
    (a+b+c)^2 - (a^2+b^2+c^2) = S
    

    a+b+c = P/4
    a^2+b^2+c^2 = P^2/16 - S
    

    换句话说:解决方案位于以P/4 切割主轴的平面与以原点为中心、半径为P^2/16-S 的球体的交点。这个交叉点是一个圆圈。从上面看,它看起来像一个椭圆,其中心与原点成 45 度,短轴沿同一条线。此外:

    1. 中心位于(P/12,P/12,P/12)
    2. 半径为r = Sqrt(P^2/16-S - 3(P/12)^2)=Sqrt(P^2/24-S)
    3. 圆位于垂直于(1,1,1) 的平面 e

    所以,如果我们在圆上有一个点,它将相对于(da,db,dc) 的中心发生位移。由于 3.,我们知道 dc = -da - db。另外,平方和必须等于半径的平方,所以:

    r^2 = da^2 + db^2 + (da+db)^2
        = 2(da^2 + db^2 + da db)
    

    现在,位移是圆的线性变换,因此我们可以将其参数化如下:

    dc = -2A cos t
    da = A cos t + B sin t
    db = A cos t - B sin t
    

    要求(da,db,dc)的长度为r,得到:

    da^2 + db^2 + dc^2
        =   A^2 cos^2 t +  B^2 sin^2 t + 2AB cos t sin t
          + A^2 cos^2 t +  B^2 sin^2 t - 2AB cos t sin t
         + 4A^2 cos^2 t
        =  6A^2 cos^2 t + 2B^2 sin^2 t
    

    要让它独立于t,我们必须有6A^2 = 2B^2 = r^2,所以

    A = r / sqrt(6)
    B = r / sqrt(2)
    

    等等

    da = r/sqrt(6) cos t + r/sqrt(2) sin t
    db = r/sqrt(6) cos t - r/sqrt(2) sin t
    

    音量变

    V = (P/12 + da)(P/12 + db)(P/12 - da - db)
      = P^3/1728 + (da db - da(da + db) - db(da + db))P/12 - da db (da + db)
      = P^3/1728 - (da^2 + db^2 + da db)P/12 - da db (da + db)
      = P^3/1728 - P r^2/24 - da db (da + db)
      = C - (r^2/6 cos^2 t - r^2/2 sin^2 t) 2 r/sqrt(6) cos t
      = C - r^3 sqrt(6)/18 (cos^2 t - 3 sin^2 t) cos t
      = C - D (4 cos^2 t - 3 cos^2 t - 3 sin^2 t) cos t
      = C - D (4 cos^3 t - 3 cos t)
      = C - D cos 3t
    

    其中 C 和 D 为正数。显然,当cos 3t-1 时达到最大值,此时音量为:

    V = P^3/1728 - P(P^2/24-S)/24 + Sqrt(P^2/24-S)^3 Sqrt(6)/18
    

    【讨论】:

      【解决方案3】:

      Lagrange Multiplier 与多个约束一起使用。 f(x,y,z) = xzy - L1*g(x,y,z) - L2*h(x,y,z) 其中 g(x,y,z)=x + y+ z-P/4 和 h (x,y,z)=xy + yz + xz-S/2

      然后你做df/dx = 0, df/dy = 0, df/dz = 0, df/dL1 = 0, df/dL2 = 0,你会得到5个方程如下:

      1. yz = L1 + L2*(y+z)
      2. xz = L1 + L2*(x+z)
      3. xy = L1 + L2*(x+y)
      4. x + y + z = p
      5. xy + yz + xy = s

      然后稍加数学,你会发现 x = y = L2 从 1 2 和 3。然后 z = p - 2*L2 从 4 和 z = (s - 2*L2^2)/ 2* L2 from 5. 现在你可以从上面的两个方程计算 L2 的值(还记得二次方程吗?)。并且体积为 V = xyz = L2 * L2 * (p - 2*L2)

      【讨论】:

        【解决方案4】:

        假设您在 codechef.com/problems/J7 遇到问题

        python 2.7 中的解决方案是

        T = int(input())
        for i in range(T):
            P = raw_input().split()
            S = int(P[1])
            P = int(P[0])
            V = (P**3)/1728.00 - P*( (P**2)/24.00-S)/24.00 + (((P**2)/24.00-S)**1.5)*(6**0.5)/18
            print("%.2f"%V)
        

        【讨论】:

        • 能否分享一下 V 的逻辑?
        • 这给出了解决方案,但没有解释其背后的逻辑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        相关资源
        最近更新 更多