luogu2404_自然数的拆分问题
时空限制 1000ms/128MB
题目背景
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
输入输出格式
输入格式:
输入:待拆分的自然数n。
输出格式:
输出:若干数的加法式子。
输入输出样例
输入样例#1:
7
输出样例#1:
1+1+1+1+1+1+1 1+1+1+1+1+2 1+1+1+1+3 1+1+1+2+2 1+1+1+4 1+1+2+3 1+1+5 1+2+2+2 1+2+4 1+3+3 1+6 2+2+3 2+5 3+4
说明
用回溯做 n≤8
代码
#include<iostream>
using namespace std;
int n,a[10]={1};
void search(int s,int k){
if (s==0){
for (int i=1; i<k-1; i++) cout<<a[i]<<"+";
cout<<a[k-1]<<endl;
return;
}
for (int i=a[k-1]; i<=s; i++)
if (i<=s && i<n){ //当前拆分i要大于等于前1位数,且不超过n
a[k] = i;
s -= i;
search(s,k+1);
s += i;
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
search(n,1); //要拆分n,搜第1项
return 0;
}