热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

探索高效算法:寻找所有和为N的组合方案

本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。

Is there a nice way for generating a list of digits (0-9), with repetitions and a length of 6, such that the sum is N, say, 20. For example:

有没有一种很好的方法来生成一个数字列表(0-9),重复和长度为6,这样总和是N,比如20。例如:

004673 -> 4+6+7+3=20
121673 -> 1+2+1+6+7+3=20
...

Thanks

4 个解决方案

#1


12  

['{0:06}'.format(i) for i in xrange(1000000) if sum(map(int,str(i))) == 20]

does the trick and needs about 5 seconds to return all 35127 numbers.

诀窍和需要大约5秒钟返回所有35127号码。

UPDATE - as a bonus, here comes the ugly-but-much-faster (~40 times faster) version:

更新 - 作为奖励,这里出现了丑陋但速度更快(约40倍)的版本:

result = []
for a in xrange(10):
    for b in xrange(10):
        for c in xrange(10):
            if a+b+c <= 20:
                for d in xrange(10):
                    if 2 

#2


6  

Much faster of other proposed solutions:

其他提出的解决方案要快得多:

def iter_fun(sum, deepness, myString, Total):
    if deepness == 0:
        if sum == Total:
            print myString
    else:    
        for i in xrange(min(10, Total - sum + 1)):
            iter_fun(sum + i,deepness - 1,myString + str(i),Total) 

def fixed_sum_digits(digits, Tot):
    iter_fun(0,digits,"",Tot) 


fixed_sum_digits(6,20)

Still some room for speeder code but then the code would be boring to be read!

仍然有一些空间用于调速器代码但是代码将无聊被阅读!

#3


2  

Using itertools and permutations:

使用itertools和permutations:

>>> from itertools import product
>>> l = []
>>> for digits in product('0123456789', repeat=6):
...     if sum(map(int, digits)) == 20:
...             l.append(digits)
...
>>> len(l)
35127
>>> l[1234]
('0', '1', '9', '0', '5', '5')

Seems to be a bit faster that eumiro's:

似乎比eumiro快一点:

>>> stm = """l = []
... for digits in product('0123456789', repeat=6):
...     if sum(map(int, digits)) == 20:
...             l.append(digits)
... """
>>> timeit.timeit(stm, setup="from itertools import product", number=3)
10.368315935134888
>>> timeit.timeit("['{0:06}'.format(i) for i in xrange(1000000) if sum(map(int,str(i))) == 20]", number=3)
14.926225900650024

#4


-1  

You can use numpy.

你可以使用numpy。

import numpy
a=[1,2,1,6,7,3]
print(numpy.cumsum(a)[-1])

推荐阅读
author-avatar
w3812127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有