描述
2021年国庆大卖电影《长津湖》以长津湖战役为背景,讲述了一个志愿军连队在极度严酷环境下坚守阵地奋勇杀敌,为长津湖战役胜利作出重要贡献的感人故事。
一天,光明村也上影《长津湖》了,大家都去电影院买票。假设票价是50元整,去买票的人都是现金支付,且每人要么只带一张50元大钞,
要么只带一张100元大钞。小村里的电影院只有一个买票窗口,并且开始卖票时,没有准备任何找零的钱(这意味着先收一张50元大钞,才能给下一位
持100元大钞的买主找零)。
在电影票开卖前,村民都自觉的排成一列,问,现在有n位手持50元大钞的村民和m位手持100元大钞的村民,问有多少种不同的排队方式,、
使得在整个卖票过程中,电影院不会出现无钱找零的情况。
注:只要有任意两个人的先后顺序不同,整个队列就是不同的排队方式
输入格式
两个正整数,以空格分隔,分别是n和m(0
输出格式
不同的排队方式,如果无任何一种成立的排队方式,则输出0
输入样例
2 2
输出样例
8
提示
使用递归方法求解
思路
该题运用递归的方法进行求解,首先我们先分析一下题目。50元的n人,100元的m人,任意两个人顺序不一样,都会造成队伍的不一样。为了方便计算,我们可以先假设拿到同样面额的人交换位置队伍是不变的。
那么有以下几种情况:
1、当n<m时,即拿到50元的人数少于100元,那么任何一种排队方式都不成立。
2、当m=0时,即拿到100元的人数为0,那么任何一种排队方式都可以,这里sum=1
3、其他情况下,当第m+n个人拿的是100元时,那么前面n+m-1中,n个拿50,m-1个拿100。当第m+n个人拿的是50时,那么前面n+m-1中,n-1个拿50,m个拿100。
由此我们可以通过递归实现。
在最后我们在分别对拿50元和拿100元进行排序。
#include<stdio.h>
//i*(i-1)*....
int st(int m)
{
int i;
int sum=1;
for(i=1;i<=m;i++)
sum=sum*i;
return sum;
}
//递归求解,分为三种情况
int fun(int m,int n)
{
long sum;
if(m<n)
sum =0;
else if(n==0)
sum=1;
else
sum=fun(m,n-1)+fun(m-1,n);
return sum;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
long t=fun(n,m);
printf("%d",t*st(n)*st(m));
}