我想在c中生成所有长度为L的数组,其中元素的总和N是固定的。例如,对于L = 3和N = 2,应该得到
{0,0,2},
{0,1,1},
{0,2,0},
{1,0,1},
{1,1,0},
{2,0,0}
我在Mathematica上发现了几篇关于如何做到这一点的帖子,但是在c中这样做的有效方法是什么?
我正在考虑使用基数3中的表示来生成所有可能的数字,然后逐个取数字并将它们放入数组中。
基数3的转换可以用
完成int BaseConvert(int number,int base){
if(number == 0 || base==10) return number;
return (number % base) + 10*BaseConvert(number / base, base);
}
最后一部分可以用
完成void ConvertNumberToVec(int x,std::vector<int> & vec)
{
int digit;
std::vector<int> vec0;
while(x > 0){
digit = x%10;
vec0.push_back(digit);
x /= 10;
}
std::reverse(vec0.begin(), vec0.end());
vec = vec0;
}
或者这是一种更好的方法吗?
答案 0 :(得分:0)
您可以编写递归算法:
permutation = [] f(L, N): if L is 0: if N is 0: print permutation return for i in 0..N: permutation.push_back(i) f(L - 1, N - i) permutation.pop_back()
使用c。轻松编码。