算法學習——遞歸之排隊購票問題


算法描述

一場球賽開始前,售票工作正在緊張的進行中.每張球票為50元,現有m+n個人排隊等待購票,其中有m個人手持50元的鈔票,另外n個人手持100元的鈔票.假設開始售票時售票處沒有零錢,求出m+n排隊購票,

算法思路

定義函數f(m,n)表示m個人手持50元,n個人手持100元共有的排隊種數

  1. 當n=0,沒有手持100元的人排隊,這個情況是找得開錢 f(m,0) =1

  2. 當m<n,(手持50元的人數小於手持100元的人數) f(m,n)=0

  3. 其他情況

當第m+n個人手持100元,他之前的m+n-1個人有m個人手持50元,n-1個人手持100元,共有的排隊種數為f(m,n-1)

當第m+n個人手持50元,他之前的m+n-1個人有m-1個人手持50元,n個人手持100元,共有的排隊種數為f(m-1,n)

根據上述情況可得到

遞歸公式f(m,n)=f(m-1,n)+f(m,n-1)

遞歸出口n=0 f(m,0)=1 m<n f(m,n)=0

算法實現

	Scanner scanner = new Scanner(System.in);
	int m = scanner.nextInt();
	int n = scanner.nextInt();
	scanner.close();
	long temp = digui(m, n);
	System.out.println(temp);
}
public static long digui(int m,int n){
	if(n==0){
		return 1;
	}else if(m<n){
		return 0;
	}else{
		return digui(m-1,n)+digui(m,n-1);
	}
}

結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM