问题描述
给一个正整数n,输出它所有的正整数加法的分解方法。
注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
输入格式
输入共1行,包含2个正整数n和m,之间用一个空格隔开。n表示待分解正整数,m是1或者2:
1表示交换加数的位置是否视为不同的分解方案;
2表示交换加数的位置是否视为相同的分解方案。
1表示交换加数的位置是否视为不同的分解方案;
2表示交换加数的位置是否视为相同的分解方案。
输出格式
输出若干行,每行表示一种分解方案。对于一种方案,先输出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
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
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
解答:bfs
#include<iostream>
using namespace std;
int sum = 0;
/**
m=1,交换加数的位置视为不同的分解方案
调用时,count = 0
*/
void dfs1(int n,int count,int*p)
{
if(n==0){ //递归基,到叶子结点时输出结果
cout<<sum<<"=";
for(int i=0;i<count;i++)
if(i==count-1)
cout<<p[i]<<endl;
else
cout<<p[i]<<"+";
return;
}
for(int i=1;i<=n;i++){
p[count]=i;
dfs1(n-i,count+1,p);
}
return;
}
/*
m=2,交换加数的位置视为相同的分解方案
调用时,count = 0
*/
void dfs2(int n,int count,int*p)
{
if(n==0){ //递归基,到叶子结点时输出结果
cout<<sum<<"=";
for(int i=0;i<count;i++)
if(i==count-1)
cout<<p[i]<<endl;
else
cout<<p[i]<<"+";
return;
}
int k = count>0 ? p[count-1] : 1; //数组中的数应该非递减的顺序
for(int i=k;i<=n;i++){
p[count] = i;
dfs2(n-i,count+1,p);
}
}
int main()
{
int n,m;
cin>>n>>m;
sum = n;
int* p = new int[n];
if(m==1)
dfs1(n,0,p);
else if(m==2)
dfs2(n,0,p);
return 0;
}