使用递归找到在人类塔的底部允许的最大人数

时间:2019-06-24 11:12:28

标签: python recursion

考虑要在舞台上进行人身塔,并且该舞台具有最大重量限制。

编写一个python程序以在基础级别上找到最大人数,以使塔的总重量不超过舞台的最大重量限制。

假设: 1.每个人重50公斤 2.在塔楼的底层,总是会有奇数个人员。

我不知道如何解决

4 个答案:

答案 0 :(得分:1)

这看起来更像是数学问题,而不是编程问题。将问题简化为最简单的数学表示形式通常将提供最有效的编程解决方案。

假设“塔”就像一座金字塔,也就是说,在每个较高级别上,人少了。

这是我们可以推断的:

  • base是一个奇数,可以表示为2*n+1
  • 金字塔P中的总人数可由base*(base+1)/2
  • 计算
  • 金字塔中所有人的权重为P*50,不能超过给定值M(我想这将是用户的输入)
  • 在最佳情况下,权重将等于最大值:50*base*(base+1)/2 = M
  • 现在,有一点代数...
  • M = 50 * base *(base + 1)/ 2
  • M = 50 *(2 * n + 1)*(2 * n + 2)/ 2 (奇数= 2 * n + 1)
  • M = 25 *(4 * n ^ 2 + 6 * n + 2)
  • M = 100 * n ^ 2 + 150 * n + 50 (瞧,看一个二次方程)
  • 0 = 2 * n ^ 2 + 3 * n +1-M / 50
  • n =(-3 +√(9-4 * 2 *(1-M / 50))/ 4
  • n =√(9-8 + 4 * M / 25)/ 4-3/4
  • n =√(4 * M / 25 + 1)/ 4-3/4
  • base = 2 * n + 1

所以您的程序可以很简单:

from math import sqrt
M    = int(input("Maximum weight on stage (Kg): "))
n    = sqrt(4*M/25+1)/4 - 3/4     
base = 2*int(n)+1                    # int(n) to ignore fractions of people
print("Base of the pyramid: ",base,"men")

您也可以证明自己:

totalWeight = 50*base*(base+1)/2
print("Pyramid Weight: ",totalWeight,"Kg")
overWeight = 50*(base+2)*(base+3)/2
print("Weight if base were",base+2,"men: ",overWeight,"Kg")

...

Maximum weight on stage (Kg): 3000
Base of the pyramid:  9 men
Pyramid Weight:  2250.0 Kg
Weight if base were 11 men:  3300.0 Kg

...

Maximum weight on stage (Kg): 3299
Base of the pyramid:  9 men
Pyramid Weight:  2250.0 Kg
Weight if base were 11 men:  3300.0 Kg

...

Maximum weight on stage (Kg): 3300
Base of the pyramid:  11 men
Pyramid Weight:  3300.0 Kg
Weight if base were 13 men:  4550.0 Kg

如果不允许使用数学方法,则可以使用迭代方法:

base = next(b-2 for b in range(3,M,2) if 50*b*(b+1)/2 > M)

计算每个奇数基数的总重量,直到超过最大值,然后使用以前的奇数基数。大概,如果不少于3个人,您甚至没有金字塔,因此您可以从3开始

如果您需要将其用作程序算法,它将转换为:

base       = 1     # preceding base
nextweight = 300   # weight for base = 3
while nextweight <= M:
    base       += 2                          # advance base (odd)
    nextweight += 50*(base+1) + 50*(base+2)  # next total weight

如果需要递归解决方案,则可以调用一个函数本身,直到到达下一个基数将超过最大权重的点为止。

def oddBase(M,base=1,total=50):
    total += 50*(base+1)  # add one level at the bottom, next even base
    total += 50*(base+2)  # add one level at the bottom, next odd base
    if total > M : return base
    return oddBase(M,base+2,total)

oddBase(3300)  # 11

答案 1 :(得分:0)

这是一个优化问题;人类金字塔的每一层都比其下一层的人少。此金字塔上的总人数由以下公式给出:

n +(n-1)+(n-2)+ ... + 2 + 1

n是金字塔底的人数。

可以通过将其视为底边为n,高度为n-1的三角形来简化上述公式:

n *(n-1)/ 2

总重量可以乘以50:

w = 50 * n *(n-1)/ 2

另外,n必须为奇数,即其2的模数应为1:

n%2 = 1

因此,您有一个要解决的优化问题:

  • 最大化n
  • 50 * n * (n - 1) / 2 < m;
  • n % 2 = 1

给出n是一个自由变量,它表示基部的宽度,而m是最大权重。

答案 2 :(得分:0)

在人类的塔中,当我们从下往上前进时,每个级别的人数开始减少1。

如果5个人站在基地,则4个人将站在基地的人,依此类推,直到一个人站在最顶层。 您可以尝试这样的事情,

i=1
while(1):
    if(sum(list(range(1,i+1)))*50 > weight_threshold):
        print(i-1)
        break
    i+=1

如果您只需要基数为奇数,则使用i + = 2而不是i + = 1

答案 3 :(得分:0)

def human_pyramid(no_of_people):

if(no_of_people==1):
    return 1*(50)
else:
    return no_of_people*(50)+human_pyramid(no_of_people-2)

def find_maximum_people(max_weight):

no_of_people=0
person_weight = 50
number = max_weight / person_weight
i=1
while(1):
    if(sum(list(range(1,i+1,2)))*50 > max_weight):
        break
    i+=2
    print(i)
i = i-2
return i

max_people=find_maximum_people(1050)

打印(最大人数)

Ps : 我使用了 rahul 代码并对其进行了修改以获得更好的结果