本帖最后由 wangzhenas 于 2016-8-14 21:28 编辑
答案: 73682
核心思路是利用从大到小运用递归法,对于大于(200,100,50,20,10,5)内的元素做递归(减少递归调用次数),每次递归时传递的元素是当前剩下的值即(200-s)以及当前元素的下标(元素从大到小排列以避免重复), 然后在结果内加上当前剩余值若仅用(1,2)组合时的组合数,比如说当前剩余值是10,如果仅有2,1的话,一共有 10//2 + 1种组合,即有(0,1,2,3,4,5)个2出现的情况
import time
t,result,money = time.time(),0,[200,100,50,20,10,5,2,1]
def combi(s=200,index=0):
global result,money
if s >= 0:
result += s//2+1
for i in range(index,6):
combi(s-money[i],i)
combi()
print(result,time.time()-t)
当前代码还可简化为如下形式:import time
t,money = time.time(),(200,100,50,20,10,5,2,1)
def combi(s=200,index=0):
global money
return s//2+1+sum(combi(s-money[i],i) for i in range(index,6) if s-money[i]>=0)
print(combi(),time.time()-t)
|