整数的分划问题。
如,对于正整数n=6,可以分划为:
6
5+1
4+2,
4+1+1
3+3
3+2+1
3+1+1+1
2+2+2
2+2+1+1
2+1+1+1+1
1+1+1+1+1+1+1
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)
搜索算法1:
#include<iostream>
using namespace std;
int n, result[1000];
void print(int k) {
for (int i = 1; i <= k; i++)
cout << result[i] << " ";
cout << endl;
}
void search(int k) {
for (int i = n; i > 0 && n >= 0; i--) {
if (i <= result[k - 1]) {
result[k] = i;
n -= i;
if (n == 0)
print(k);
else
search(k + 1);
n += i; //回溯一步
}
}
}
int main() {
cin >> n;
result[0] = n + 1;
search(1);
return 0;
}
搜索2:
#include<iostream>
using namespace std;
int n, result[1000], t;
void print(int k) {
for (int i = 1; i <= k; i++)
cout << result[i] << " ";
cout << endl;
}
void search(int k, int sum) {
for (int i = result[k - 1]; i > 0; i--) {
if (i <= result[k - 1]) {
result[k] = i;
if (sum + i >= n) {
if (sum + i == n)
print(k);
}
else
search(k + 1, sum + i);
}
}
}
int main() {
cin>>n;
result[0] = n + 1;
search(1, 0);
return 0;
}