我正在尝试编写C代码以生成具有给定编号的 不同 元素的所有可能的分区(分为2个或更多部分)。给定分区的所有数字之和应等于给定数字。例如,对于input n = 6,具有2个或多个具有不同元素的元素的所有可能分区是:
n = 6
我认为应该使用递归方法,但是我无法处理不同元素的附加约束。C / C ++ / Java中的伪代码或示例代码将不胜感激。
谢谢!
编辑: 如果使事情变得容易,我可以忽略具有至少2个元素的分区的限制。这将允许将数字本身添加到列表中(例如,6本身将是一个琐碎但有效的分区)。
我草绘了此解决方案(可以美化和优化),该解决方案不应生成重复项:
void partitions(int target, int curr, int* array, int idx) { if (curr + array[idx] == target) { for (int i=0; i <= idx; i++) cout << array[i] << " "; cout << endl; return; } else if (curr + array[idx] > target) { return; } else { for(int i = array[idx]+1; i < target; i++) { array[idx+1] = i; partitions(target, curr + array[idx], array, idx+1); } } } int main(){ int array[100]; int N = 6; for(int i = 1; i < N; i++) { array[0] = i; partitions(N, 0, array, 0); } }