【问题描述】
给一个正整数n,输出它所有的正整数加法的分解方法。
注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
【输入格式】
输入共1行,包含2个正整数n和m,之间用一个空格隔开。n表示待分解正整数,m是1或者2:
1表示交换加数的位置是否视为不同的分解方案;
2表示交换加数的位置是否视为相同的分解方案。
【输出格式】
#include<bits/stdc++.h>
using namespace std;
int ans[20];
int n,m;
void dfs1(int sum,int idex)
{
int i;
if(sum==n)
{
cout<<n<<"="<<ans[0];
for(i=1;i<idex;i++)
{
if(ans[i]!=0)
cout<<"+"<<ans[i];
}
cout<<endl;
}
if(sum>n) return;
for(i=1;i<=n;i++)
{
ans[idex]=i;
dfs1(sum+i,idex+1);
}
}
void dfs2(int sum,int idex,int cnt)
{
int i;
if(sum==n)
{
cout<<n<<"="<<ans[0];
for(i=1;i<idex;i++)
{
if(ans[i]!=0)
cout<<"+"<<ans[i];
}
cout<<endl;
}
if(sum>n) return;
for(i=cnt;i<=n;i++)
{
ans[idex]=i;
dfs2(sum+i,idex+1,i);
}
}
int main()
{
cin>>n>>m;
// cout<<n<<" "<<m<<endl;
if(m==1) dfs1(0,0);
else dfs2(0,0,1);
return 0;
}
输出若干行,每行表示一种分解方案。对于一种方案,先输出n,再输出一个“=”。然后输出分解的各数,不同的数之间用一个“+”连接。
样例输入
5 2
样例输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5
【输入输出样例2】
样例输入
5 1
样例输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+2+1
5=1+1+3
5=1+2+1+1
5=1+2+2
5=1+3+1
5=1+4
5=2+1+1+1
5=2+1+2
5=2+2+1
5=2+3
5=3+1+1
5=3+2
5=4+1
5=5
数据规模和约定
对于50%的数据有M=1,另有50%的数据有M=2。对100%的数据,n≤15。