任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
输入格式:
输入n, 1<n<20。
输出格式:
按字典序输出具体的方案。
输入样例:
在这里给出一组输入。例如:
7
输出样例:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
http://t.csdnimg.cn/CLxZX :之前写的acwing动态规划整数划分 只能统计方案数
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1000
int x[N]={0}; //x[i]:第i个位置存放什么数
int n;
void BackTrack(int i,int left)
{
if(left==0) //整数被拆分完了
{
i=i-1; //因为BackTrack(i+1,left) 而此时的x[i]处并没有存放东西
cout<<n<<"=";
for(int j=1;j<i;j++) cout<<x[j]<<"+";
cout<<x[i]<<endl;
}
else
{
for(int j=x[i-1];j<=left;j++) //对第i个位置选数字j
{
if(j<n) //防止出现7=7的情况
{
x[i]=j;
left-=j;
BackTrack(i+1,left);
left+=j;
}
}
}
}
int main()
{
cin>>n;
int left=n; //整数剩余多少
x[0]=1;
BackTrack(1,left);
return 0;
}