小鸡一次可以吃n颗米(n>0),总共有m颗米(m>0),在不考虑小鸡最大能力的情况下,小鸡共有多少种吃法。(m与n之间无大小限定)
思路:自上而下的方式。
小鸡最后一次吃米,可能吃1颗米,2颗米,……,n颗米。因此,最后一次吃米的吃法,就是之前的综合。
public static int haveRice(int m,int n){
if(m<0)
return 0;
else if(m==0)
return 1;
else {
int result=0;
for(int i=1;i<=n;i++){
result+=haveRice(m-i,n);
}
return result;
}
}
与小孩上楼梯的走法的阶梯方法类似,此处采用递归。如果对空间有要求,还可以进行动态规划的优化。参见小孩上楼梯的走法:[小孩上楼梯的走法](http://blog.csdn.net/shangqing1123/article/details/47360591 "")
设计算公式为f(n,m)
,取k=min(n,m)
,那么第一口下去有1..k
共k
种吃法,每种吃法如果还有剩余继续用公式递归。
公式可以定义为
f(n,1) = 1
f(1,m) = m
f(n,m) = f(n,m-1)+f(n,m-2)+...+f(n,m-k) 其中 k=min(n,m)
先认为n 总吃法数 = m次吃完的方法数 + m-1次吃完的方法数 + ... + m-n-1次吃完的方法数;
刚好k次吃完的方法数 = C (m-1) (k-1);(插板法,排列组合常用方法。)
n>m也可以类似的计算。
递归,(也可以用排列组合)
剩余m颗米,每次最多吃n颗。
int waysToEatRemainds(int iRemainds, int iMaxPerTime)
{
int iWays = 0;
if (iRemainds > 0)
{
for (int i =1; (i <= iMaxPerTime) && (i <= iRemainds); ++i)
{
iWays += waysToEatRemainds(iRemainds - i);
}
}
return iWays;
}
总数就是waysToEatRemainds(m, n);
用递归吧 这种问题 好像递归是最好的解决方案
小鸡一次可以吃1到n颗米,然后每次吃的米数在1到n之间,这题就有难度了
我有2种思路:
第一种:
1判断小鸡吃完所有米最多要多少次(设为a),最少要多少次(设为b)。
2,建数组,包含1至n,也就是小鸡每次可能吃米的颗数集合,生成a~b位数的数组集合,
3,一个一个判断生成的数组各成员数值之和是否等于总米粒数m,如果等于,则结果+1。
第二种方法
1.判断小鸡吃完所有米最少与最多需要的次数,分别为a,b。
2,而后算出次数为a时有多少种吃法,a+1时有多少种吃法……直到b。这里面每次计算时,可以找到规律。
以上是我的2个粗浅想法,大神勿喷
二元递归,一楼正解。