如有不足还请指正
题目
思路
还鞋的人有m个,租鞋的人有n个。先不考虑体育组那有没有鞋,只看怎么排队,就是一个排列组合问题。
- 一个人还鞋后,剩下m-1个还鞋的人和n个借鞋的人,问题变为 f(m-1, n)。
- 一个人借鞋后,剩下m个还鞋的人和n-1个借鞋的人,问题就变为 f(m, n-1)。
可初步得递推公式:f(m-1, n) + f(m, n-1)
现在来看限制条件,体育组那里必须有鞋可借。
把m看成一个整体,n看成一个整体,不考虑m,n个人的内部怎么排队。
- 如果是还鞋的人比借鞋的人少(也包括m=0这种情况),即
m<n
,则没办法满足要求,此时不论怎么排队都不满足限制条件,所以当m<n
时,问题的解为0。 - 如果还鞋的人比借鞋的人多,
m>=n
,此时只需要进行排列组合即可。 - 如果还鞋的人有,借鞋的人没有,
n==0
,此时问题的解为1。
最后根据m,n的关系列出公式:
代码
int fun2(int m, int n)
{
if(m<n || m==0)
{
return 0;
}
else if(n == 0)
{
return 1;
}
else // 一个人还了鞋后,剩下m-1个还鞋的和n个借鞋的
{ // 一个人借了鞋后,剩下m个还鞋的和n-1个借鞋的
return fun2(m-1, n) + fun2(m, n-1);
}
return 0;
}
int main(int argc, const char * argv[])
{
printf("%d\n", fun2(3, 2));
return 0;
}