使用过程生成具有特殊属性的数组

时间:2015-10-04 22:12:47

标签: algorithm pseudocode

我有一个大小为n的数组。只要以下属性成立,每个元素都可以保存任何整数:

1) All elements are non-negative
2) sum(array[0,i+1])<i for 0<=i<n 
3) sum(array)=n-1

让我们把这样一个数组称为一个桶。

我需要提出一个生成下一个存储桶的过程。

我们可以假设第一个桶是{0,0,0...n-1}

示例:对于n=5,一些可能的组合是

[0 0 0 0 4]    
[0 0 0 1 3]    
[0 0 0 2 2]    
[0 0 0 3 1]    
[0 0 1 2 1]    
[0 0 2 1 1]    
[0 1 1 1 1]    
[0 1 0 0 3]    
[0 1 1 0 2]

我无法想出能够达到所有可能组合的程序。任何提示/提示? (注意我想生成下一个桶。我不打算一次打印出所有可能的桶)

1 个答案:

答案 0 :(得分:2)

您可以使用简单的回溯程序。我们的想法是跟踪当前的sum和当前索引i。这将允许您表达所需的约束。

n = 5
a = [0] * n


def backtrack(i, sum):
    if i > 0 and sum > i-1:
        return
    if i == n:
        if sum == n-1:
            print(a)
        return
    for e in range(n-sum):
        a[i] = e
        backtrack(i + 1, sum+e)

backtrack(0, 0)

test run