python - 代码优化-组合数量

标签 python optimization python-itertools

给定一个数字C(C是一个整数),并给定一个数字列表(我们称之为N,列表N中的所有数字都是整数)。 我的任务是找出代表 C 的可能性的数量。

例如:

输入:

C = 4

N = [1, 2]

输出:

3

因为:

4 = 1 + 1 + 1 + 1 = 1 + 1 + 2 = 2 + 2

我的代码对于少量数据运行得很好。但是我不知道如何优化它,以便它也适用于更大的整数。任何帮助将不胜感激!

这是我的代码:

import numpy
import itertools
def amount(C):
    N = numpy.array(input().strip().split(" "),int)
    N = list(N)
    N = sorted(N)
    while C < max(N):
        N.remove(max(N))
    res = []
    for i in range(1, C):
        for j in list(itertools.combinations_with_replacement(N, i)):
            res.append(sum(list(j)))
    m = 0
    for z in range (0, len(res)):
        if res[z] == C:
            m += 1
    if N[0] == 1:
        return m + 1 
    else:
        return m 

最佳答案

您的算法的复杂度是O(len(a)^С)。要更有效地解决此任务,请使用 dynamic programming想法。

假设dp[i][j]等于使用术语a[0]、a[1]、...的i的分区数,a[j]。数组 a 不应包含重复项。该解决方案的运行时间为O(C * len(a)^2)

def amount(c):
    a = list(set(map(int, input().split())))

    dp = [[0 for _ in range(len(a))] for __ in range(c + 1)]
    dp[0][0] = 1

    for i in range(c):
        for j in range(len(a)):
            for k in range(j, len(a)):
                if i + a[k] <= c:
                    dp[i + a[k]][k] += dp[i][j]

    return sum(dp[c])

关于python - 代码优化-组合数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41352773/

相关文章:

python - 修改Python脚本批量转换目录下所有 "WOFF"文件

python - Perl 中有类似 Python Itertools 的东西吗?

python - 在 Tkinter Canvas 中移动球

optimization - 您如何分析和优化CUDA内核?

javascript - Javascript 中的两个字母变量名?

c++ - 为什么线程随机这么慢,-(或者我的代码哪里错了!)

python - 创建字符串的变体

python - Itertools 在 python 中创建 Ts 和 Hs 的组合作为字符串

python - Google App Engine 数据库查询内存使用情况

python - 如何调试 Flask 应用程序