1. 程式人生 > >【備戰藍橋杯】【遞迴】【C語言】【排隊購票問題】

【備戰藍橋杯】【遞迴】【C語言】【排隊購票問題】

問題描述:

         售票工作正在進行,每張票為50元,現在有m+n人排隊等待購票,其中有m人手持50元,n人手持100元,假設售票處不設找零,那麼若想使售票處不會出現找不開零錢的局面,請你幫忙設計不同的排隊方案。特別說明的是,拿同樣面值的人對換位置為同一種方案。

演算法分析:
一:n=0; 那麼說明買票的人都是手持50元,所以不會出現找不開零錢的局面,所以這是一種排隊方案;
二:m=0; 那麼說明買票的人都是手持100元,所以一定會找不開零錢,所以沒有排隊方案;
三:m<n; 那麼說明買票的人中,手持50元的人數少於手持100元的人數,所以肯定會出現找不開零錢的局面,所以同樣沒有排隊方案;
四:m>n; 此時,買票的人中,手持50元的人數多於手持100元的人數,所以可以有排隊方案,我們這裡來分析一下第m+n人的位置:
      (1):第(m+n)人手持100元站在第(m+n-1)人的後面,那麼他之前的人有(m)人手持50元,有(n-1)人手持100元,此種情況共有f(m,n-1)種排隊方式;
      (1):第(m+n)人手持50元站在第(m+n-1)人的後面,那麼他之前的人有(m-1)人手持50元,有(n)人手持100元,此種情況共有f(m-1,n)種排隊方式;

所以通過第(m+n)人就可以分析出遞迴關係為:

f(m,n)=f(m-1,n)+f(m,n-1)

邊界條件: 當m<n時,f(m,n)=0; 當n=0時,f(m,n)=1; 當 m=0時,f(m,n)=0;

#include<stdio.h>
int paidui(int m,int n){
	int result;
	if(n==0)return 1;
	else if(m<n)return 0;
		else result=paidui(m,n-1)+paidui(m-1,n);
		return result;
}
int main(){
	int m,n;
	printf("please input m&n:");
	scanf("%d %d",&m,&n);
	printf("paidui number:%d",paidui(m,n));
	return 0;
}