【问题描述】周老师现有m个苹果,现要将苹果完全分配给不定人数的小朋友们,每个小朋友的苹果数均不相同。这样的分配可能有多种方式。例如,总数m为6个苹果时,周老师找到了四种不同的分配方式,分别为6=6,6=5+1,6=4+2, 6=3+2+1。请找出当m个苹果时,周老师的苹果分配方式是多少种。
【输入形式】
输入一个正整数 m表示周老师拥有的苹果总数
【输出形式】
输出一个整数,表示周老师的苹果有几种分配方式
【样例输入】
6
【样例输出】
4
解题思路:观察以下数字组合
1,2,3
1,5
2,4
6
它们的共同点在于两两不相同,且加起来等于6.
因此我们可以引入变量,每次要拿走的苹果数从1递增到苹果总数,这样既可以保证数字两两不相同,又可以保证组合只出现一次。
这道题并没有规定苹果要分配给多少人,因此用传统的循环迭代的方式难以进行。用递归可以简单很多。
函数参数:苹果总数和当次拿走的苹果数量。
递归结束条件:苹果总数小于或等于当次拿走的苹果数量。
递归公式:如果这次拿走,下次多拿走一个时剩余苹果数目的分配方案 + 如果这次不拿走,下次多拿走一个时苹果数目的分配方案。
这样可以保证函数返回值为所有分配值都大于或等于拿走苹果数量的方案数。
注意:递归题目的解答一定是站在一个层面的递归内进行思考,不要站在整体思考。那样做没有意义也废脑筋。这道题成功的让我明白了这个观点。
#include<bits/stdc++.h>
using namespace std;
int fenpei(int a,int b)
{
int c;
if(a<b)
{
c=0;
}
else if(a==b)
{
c=1;
}
else
{
c=fenpei(a,b+1)+fenpei(a-b,b+1);
}
return c;
}
int main()
{
int m=0;
cin>>m;
cout<<fenpei(m,1);
return 0;
}
其实这是我讨论课上的内容,我把它放在了博客里,如果这篇文章帮到了你,请点个赞让我知道吧,哈哈。