|
发表于 2016-8-14 20:40:31
|
显示全部楼层
本帖最后由 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)
复制代码
|
评分
-
查看全部评分
|