百马百担货物问题小问题引发的联想
2008-11-18 05:18 Logic0 阅读(244) 评论(0) 编辑 收藏 举报# 有这样一道题目:100匹马,100担货物,大马一次可以拉3担货物,中马一次可以拉2担货物,小马2匹才能拉1担货物。
import time
start = time.time()
# 方法一:
for x in range(1,100):
for y in range(1,100):
for z in range(1,100):
if x+y+z==100 and x*3+y*2+z*0.5==100:
print x ,y ,z
print time.time()-start
start = time.time()
# 方法一需要执行100万次循环.
# 方法二:根据马总数为100,那么第三层循环其实可以舍去.
for x in range(1,100):
for y in range(1,100):
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# 方法二需要执行1万次循环
# 方法三:在二的基础上,再对上下界进行优化
# 大马最多只能有33匹,所以最外层循环可以只到上界33;中马类推
for x in xrange(100/3+1):
for y in range( 51): #(100-x*3)/2+1 ):
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# 方法三需要执行33*50=1650次循环
# 方法四:我们回头看这个问题,根据上述的那个公式,发现这其实是个二元一次方法而已.那么,理论上,只需要用一个循环来解决问题.
# x*6 + y*4 + 100 - x - y = 200
# x*5 + y*3 = 100
# y = (100-x*5)/3 # 此处还发现x上界可进一步优化到100-x*5>0
for x in xrange(100/5+1):
y = (100-x*5)/3
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# OK,方法四只执行了21次循环.比起方法一的100万次循环,你觉得如何?
# 从方法四中我们看出来,x必须满足条件使100-x*5能被3整除,第一个x是2,以后x步进3,直到21.
for x in xrange(2,100/5+1,3):
print x,(100-x*5)/3,100-x-(100-x*5)/3
只有7次循环,一次出一个结果。
算法的优化,从100万到7,呵呵
import time
start = time.time()
# 方法一:
for x in range(1,100):
for y in range(1,100):
for z in range(1,100):
if x+y+z==100 and x*3+y*2+z*0.5==100:
print x ,y ,z
print time.time()-start
start = time.time()
# 方法一需要执行100万次循环.
# 方法二:根据马总数为100,那么第三层循环其实可以舍去.
for x in range(1,100):
for y in range(1,100):
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# 方法二需要执行1万次循环
# 方法三:在二的基础上,再对上下界进行优化
# 大马最多只能有33匹,所以最外层循环可以只到上界33;中马类推
for x in xrange(100/3+1):
for y in range( 51): #(100-x*3)/2+1 ):
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# 方法三需要执行33*50=1650次循环
# 方法四:我们回头看这个问题,根据上述的那个公式,发现这其实是个二元一次方法而已.那么,理论上,只需要用一个循环来解决问题.
# x*6 + y*4 + 100 - x - y = 200
# x*5 + y*3 = 100
# y = (100-x*5)/3 # 此处还发现x上界可进一步优化到100-x*5>0
for x in xrange(100/5+1):
y = (100-x*5)/3
if x*3+y*2+(100-x-y)*0.5 == 100:
print x,y,100-x-y
print time.time()-start
start = time.time()
# OK,方法四只执行了21次循环.比起方法一的100万次循环,你觉得如何?
# 从方法四中我们看出来,x必须满足条件使100-x*5能被3整除,第一个x是2,以后x步进3,直到21.
for x in xrange(2,100/5+1,3):
print x,(100-x*5)/3,100-x-(100-x*5)/3
只有7次循环,一次出一个结果。
算法的优化,从100万到7,呵呵