我需要一个用于partition-problem
的c ++算法解决方案简单说明:查找得到数字n的所有总和。 例如
这个问题似乎很容易,但我找不到解决方案。我接近制造这种暴力,因为最高的输入是11.关于这个问题的文章是高度数学的,我真的不明白。
谢谢大家!
答案 0 :(得分:4)
您可以尝试使用函数F的递归方法来查找给定数字X的所有第一级分区,即X表示为两个整数a,b< X然后再次在a和b上调用F,直到它们不再被分区为止。 Python中的Here is an example可能对您在C ++中编写自己的内容有所帮助
答案 1 :(得分:1)
只需将它们放在定义明确的顺序中即可。然后编写一个函数来查找该顺序中的第一个条目。然后编写一个函数来查找该顺序中的下一个条目。那么这个问题很简单。
例如,在5的情况下,第一个条目11111或5有两个选项。这些条目中的任何一个都很容易生成。然后你只需要一个操作来从给定的条目中获取“下一个条目”。重复该操作,直至失败并完成。
我建议这个顺序:
11111
1112
113
122
14
23
5
答案 2 :(得分:1)
/*
E.g.
input number:5
5
1 4
1 1 3
1 1 1 2
1 1 1 1 1
1 2 2
2 3
*/
#include <iostream>
#include <vector>
using namespace std;
void print (vector<int>& v, int level){
for(int i=0;i<=level;i++)
cout << v[i] << " ";
cout << endl;
}
void part(int n, vector<int>& v, int level){
int first; /* first is before last */
if(n<1) return ;
v[level]=n;
print(v, level);
first=(level==0) ? 1 : v[level-1];
for(int i=first;i<=n/2;i++){
v[level]=i; /* replace last */
part(n-i, v, level+1);
}
}
int main(){
int N;
cout << "input number:";
cin >> N;
vector<int> v(N);
part(N, v, 0);
}