Python 求整数的线性组合
我试过了,但找不到类似的问题。如果有重复的问题,请给我链接 我在论坛上看到有人问了一个有趣的算法问题。问题是,有多少种方法可以将106拆分为10、20、50、1、2和5的线性组合?例如,106=10*6+1*6,106=50*2+2*1+1*4 我用python解决了这个问题,但速度非常慢。我还推广了我的函数,这样它不仅可以应用于106,也可以应用于其他数字 有没有办法让我的算法更快?我花了几分钟得到160种方法,这是所有解决方案中非常小的一部分,我并没有耐心等待更多的结果,因为随着递归的进行,一种解决方案将花费越来越多的时间Python 求整数的线性组合,python,python-3.x,algorithm,dynamic-programming,Python,Python 3.x,Algorithm,Dynamic Programming,我试过了,但找不到类似的问题。如果有重复的问题,请给我链接 我在论坛上看到有人问了一个有趣的算法问题。问题是,有多少种方法可以将106拆分为10、20、50、1、2和5的线性组合?例如,106=10*6+1*6,106=50*2+2*1+1*4 我用python解决了这个问题,但速度非常慢。我还推广了我的函数,这样它不仅可以应用于106,也可以应用于其他数字 有没有办法让我的算法更快?我花了几分钟得到160种方法,这是所有解决方案中非常小的一部分,我并没有耐心等待更多的结果,因为随着递归的进行,
def main(total,*args):
def recursion(Sum,method):
for arg in args:
if Sum<arg:
continue
method[arg]+=1
if Sum>arg:
recursion(Sum-arg,method)
else:
methods.append(method.copy())
method[arg]-=1
methods=[]
recursion(total,{ arg:0 for arg in args})
return len(methods)
main(106,10,20,50,1,2,5)
def main(总计,*args):
def递归(求和,方法):
对于args中的arg:
如果是Sumarg:
递归(求和参数,方法)
其他:
append(method.copy())
方法[arg]-=1
方法=[]
递归(总计,{arg:0表示args}中的arg)
返回len(方法)
干管(106,10,20,50,1,2,5)
这与硬币兑换问题类似。您可以参考以下链接了解各种解决方案的方法:
谢谢!递归太慢了。有没有一种方法可以找到所有的组合,而不仅仅是组合的数量?要找到所有的组合,你必须使用递归方法尝试每一种排列,这将是非常慢的。