算法的逐步优化:100匹马拉100包货的问题

回复的python列表里的一个讨论
====问题的提出====
peng cao <lucascao288@gmail.com>
reply-to        python-cn@googlegroups.com
to      python-cn@googlegroups.com
date    Sun, Nov 16, 2008 at 13:48
subject [CPyUG:71453] 想问个初级问题!
有这样一道题目:100匹马,100担货物,大马一次可以拉3担货物,中马一次可以拉2担货物,小马2匹才能拉1担货物。  

====作者的初步解决方案(方法一)====

后来我参照C的源码,知道要用循环写:
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 虽然自己能写出来,但是我还是无法理解什么时候该用循环嵌套??

××评××

虽然说是基于C的,其实初学BASIC的学生,也会是这个写法。能够解决问题。但是要100万次循环!


guangge77 <guangge77@gmail.com>


 # 方法二:根据马总数为100,那么第三层循环其实可以舍去. for x in range(101): for y in range(101): if x*3+y*2+(100-x-y)*0.5 == 100: print x,y,100-x-y # 方法二需要执行1万次循环

# 方法三:在二的基础上,再对上下界进行优化
# 大马最多只能有33匹,所以最外层循环可以只到上界33;中马类推
for x in xrange(100/3+1):
        for y in range(100/2+1):        # 或(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万次循环,你觉得如何?

最NB的

# 方法五:
# 好吧,我承认,最BT的来了,这个循环只运行7次,每次都找出一个解.
# 从方法四中我们看出来,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
这应该是此问题的最简解决方法了,我已经找不出再可以优化的地方了。
若某一天我能够达到,不经过方法一至四,而直接写出方法五,那么我解决问题的能力,相信是不止提升一个台阶。但目前,我远远做不到这一点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值