例如,如果我有这个数组:{2,3,1}第一个元素可以在{0,1,2}中分解,第二个元素在{0,1,2,3}和第三个元素中分解{0,1}中的一个。因此,我必须使每一个组合的总和成为可能。
example:
0,1,0
0,0,0
0,3,1
2,3,1
.....
我对这个问题的想法就是制作一种这样的树。
0 1 2
| | | | | | | | | | | |
0 1 2 3 0 1 2 3 0 1 2 3
| | | | | | | | | | | | | | | | | | | | | | | |
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
所以我的想法是制作一个Recursive函数来得到总和:
1) move from top to bottom and when i find the limit change the move.
2) move from left to right, and when i find the limit in the right i return.
3) go back and move to the right, and back to the first step.
这是我的代码:
void tree(int*A, int i,int n,int j,int mov){
if(mov){ ///move from up to bottom.
if(i==n){ ///n is the large of the array.
return; ///
tree(A,i-1,n,j+1,0);
}
tree(A,i+1,n,j,1);
}
else{ ///move from left to right.
if(j>A[i]){ ///j is decomposition of the element.
return;
}
tree(A,i,n,j+1,0);
}
}
我没有赚到任何金额,我只是试图回顾所有可能的组合。但它不起作用。当函数找到限制时,我认为这是一个问题。
我真的想自己解决这个问题,但我现在处于一个死角,也许需要了解一些关于递归函数的东西,所以请不要提供完整的解决方案,我想要通过我的方式学习。我只是想知道我能做些什么。这是解决这个问题的最佳方法吗?
另外,请说明问题是否清楚,我的英语是基本的,所以我有问题来表达我想要的东西。