Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求整数的线性组合_Python_Python 3.x_Algorithm_Dynamic Programming - Fatal编程技术网

Python 求整数的线性组合

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种方法,这是所有解决方案中非常小的一部分,我并没有耐心等待更多的结果,因为随着递归的进行,

我试过了,但找不到类似的问题。如果有重复的问题,请给我链接

我在论坛上看到有人问了一个有趣的算法问题。问题是,有多少种方法可以将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)

这与硬币兑换问题类似。您可以参考以下链接了解各种解决方案的方法:

谢谢!递归太慢了。有没有一种方法可以找到所有的组合,而不仅仅是组合的数量?要找到所有的组合,你必须使用递归方法尝试每一种排列,这将是非常慢的。