注意:
1. 根据输入的要求决定交换加数的位置是否视为不同的分解方案。
2. 不分解也视为一种分解方案。
3. 按字典序输出所有分解方案,格式见样例。
1表示交换加数的位置是否视为不同的分解方案;
2表示交换加数的位置是否视为相同的分解方案。
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+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
#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;
}
72



被折叠的 条评论
为什么被折叠?



