64,635
社区成员
发帖
与我相关
我的任务
分享
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法(用K表示)?注意:5,1,1和1,5,1是同一种分发。
int f(int n,int m)//m代表苹果,n代表盘子
{
int dev;
if(n==1||m==0)
return 1;
if(n>m)
{
dev=f(m,m);
return dev;
}
else
{
dev=f(n-1,m)+f(n,m-n);
return dev
}
}
#include <iostream>
using namespace std;
int n; //盘子总数
int f(int m,int cur) //表示m个苹果,当前处于第cur个盘子总共有多少种方法
{
//如果放到了最后一个盘子,cur==n,那么只有将剩下的苹果都放进最后一个盘子
//如果没有苹果(注意:有苹果的情况下,下面两种递归都会处理得当!!),那么方案只有1种,就是不放苹果
if(cur==n || m==0)
{
return 1;
}
//如果苹果不足,我们可以直接放到相应的盘子,不用再试探了,同时也避免了###处m-(n-cur+1)为负数的情况
if(n-cur+1 > m) //cur以及之后的盘子比苹果还多,那么只能把这些苹果放到最后m个盘子里保证count[i]<=count[i+1]
{
return f(m,n-m+1); //n-m是最后m个盘子的开始下标
}
//苹果足够,放当前第cur个盘子,有两种方案
return
f(m,cur+1)
//第cur盘子不放苹果,那么就再也不放了,所以cur+1,你可以试想如果cur不+1,会无限递归f(cur+1,m),这一层递归的作用
//其实是停止放第cur个盘子的意思,如果你执行下边那一句递归若干次,即给cur盘子以及之后放了若干次苹果之后,通过这一个
//递归就可以进入到cur+1盘子开始继续做
+f(m-(n-cur+1),cur); //#############
//第cur盘子放苹果,为了不出现重复的情况,必须给cur以及之后的所有盘子都放一个苹果,一共花费了
//n-cur+1个苹果,所以给m-(n-cur+1)就是剩下的苹果,cur保持不变,意思是我们下一次依旧在cur盘子进行抉择放或者不放
}
int main()
{
n=3;
cout<<f(3,1)<<endl; //3个苹果放入3个盘子
return 0;
}
if(n>m)
{
dev=f(m,m);
return dev;
}
\纠正,倒数第三行:f(n,m-n)