2044: 【回溯】自然数的拆分问题
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
输入自然数N,拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入
待拆分的自然数N。
输出
若干数的加法式子。
样例输入 Copy
7
样例输出 Copy
1+6
1+1+5
1+1+1+4
1+1+1+1+3
1+1+1+1+1+2
1+1+1+1+1+1+1
1+1+1+2+2
1+1+2+3
1+2+4
1+2+2+2
1+3+3
2+5
2+2+3
3+4
#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
const int M = 100005;
int n;
int a[10000];
void print(int n){
for(int i=1; i<=n; i++){
cout << a[i];
if(i!=n) cout << "+";
}
cout << endl;
}
void dfs(int n,int ans){
for(int i=1; i<=n/2; i++){ //n/2 保证输出从1开头到n/2开头
if(i>=a[ans-1]){
a[ans] = i;
a[ans+1] = n-i;
print(ans+1); //输出ans+1个
dfs(n-i,ans+1);
}
}
}
int main()
{
cin >> n;
a[0] = 0;
dfs(n,1);
return 0;
}