扔鸡蛋问题
问题描述
你面前有一栋 N N N 层的楼,高于某一层后扔鸡蛋会碎,给定 n n n 个鸡蛋,确定限制高度。
代码
import numpy
funnum={}
def fun(N:int,n:int,k:int):
'''
f(N,n,k)=max{ min{f(N-k,n,k')} , min{f(k-1,n-1,k')} }+1
'''
global funnum
if n==1:
return N,numpy.arange(1,N+1)
if N<=1:
return N,numpy.arange(1,N+1)
f1=N+1
for k2 in range(1,N-k+1):
if (N-k,n,k2) not in funnum:
funnum[(N-k,n,k2)]=fun(N-k,n,k2)
if funnum[(N-k,n,k2)][0]<=f1:#显然同数量时应该k越大越优
f1=funnum[(N-k,n,k2)][0]
klist=numpy.append(k,funnum[(N-k,n,k2)][1]+k)
f2=N+1
if k==1:
return f1+1,klist
for k2 in range(k-1,0,-1):
if (k-1,n-1,k2) not in funnum:
funnum[(k-1,n-1,k2)]=fun(k-1,n-1,k2)
if funnum[(k-1,n-1,k2)][0]<=f2:
f2=funnum[(k-1,n-1,k2)][0]
klist2=numpy.append(k,funnum[(k-1,n-1,k2)][1])
if f2 <= f1 and N>k:
return f1+1,klist
return f2+1,klist2
if __name__=='__main__':
N=100;n=2
minfun=N
klistmin=[]
for k in range(1,N+1):
funn,klist=fun(N,n,k)
if funn<=minfun:
klistmin=klist
minfun=min(minfun,funn)
if k%10==1:
print(k,funn)
print('*********************>',minfun)
print(klistmin)