[信息学奥赛一本通]自然数的拆分
题解
解析
可能有些人看到这道题目会有点懵圈,因为那恐怖如斯(哈哈)的输出格式令人发指,其实这道题目并不难。我们可以把它分成小问题来解决。
看向例子,
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
total=14
分拆不用多说,上代码
int n;
int a[MAX];
void print(int step)
{
cout<<n<<"="<<a[1];
for(int i=2;i<=step;i++)
cout<<"+"<<a[i];
cout<<endl;
}
void dfs (int sum,int step)
{
for(int i=a[step-1];i<=sum;i++)
{
if(i<n)
{
a[step]=i;
sum-=i;
if(sum==0)
print(step);
else
dfs(sum,step+1);
sum+=i;
}
}
}
int main()
{
cin>>n;
a[0]=1;
dfs(n,1);
return 0;
}
头文件不必多说
输出时需注意!!!!!!
不要写成cout<<a[i]<<"+";
感谢支持
浙公网安备 33010602011771号