經典遞歸--排隊購票

一場球賽開始前,售票工作正在緊張的進行中。每張球票爲50元,現有30個人排隊等待購票,其中有20 個人手持50元的鈔票,另外10個人手持100元的鈔票。

假設開始售票時售票處沒有零錢,求出這30個人排隊購票,使售票處不至出現找不開錢的局面的不同排隊種數。(約定:拿同樣面值鈔票的人對換位置後爲同一種排隊。)
輸入:

8 7

輸出:

1430

輸入:

15 13

輸出:

7020405

解析:這個題就是一個簡單的遞歸問題,對於遞歸問題其退出遞歸的條件一定要好好想清楚,改題目中要求能夠找開零錢,所以先不考慮手持50元的人和手持100元的人分別有多少人,要想滿足條件需要第一個排隊的人必須是手持50元的人,並且在排隊的過程中都是手持50元的人>=手持100元的人,否則將無零件可以找,詳細遞歸過程如下:

代碼:

import java.util.ArrayList;
import java.util.Scanner;

public class 排隊購票
{
	private static char[] c;   //排隊方式,a代表手持50元的人,b代表手持100元的人
	private static int n;      //手持50元人數
	private static int m;      //手持100元人數
	private static int cnt = 0;     //記錄下符合要求的排隊個數
	
	public static void Method(int i,int j,int t)  //i代表手持50元的人,j代表手持100元的人,t代表下標
	{
		if(i>n||j>m)      //手持50元的人數不得超過n人,手持100元人數不得超過m人
		{
			return;
		}
		if(i<j)        //當前已排好的隊形必須必須手持50元的人多,否則零錢不夠
		{
			return;
		}
		if(i==n&&j==m)    //隊形排好
		{
			
			String s = new String(c);  //s代表所佔隊形
//			System.out.println(s);   //輸出一個隊形
			cnt++;    //記錄下有效個數
			return;
		}
		if(i<n)   //手持50元的人還沒有全部入隊
		{
			c[t] = 'a';    //a代表手持50元的人
			Method(i+1,j,t+1);   //手持50元的人入隊,下標+1
		}
		if(j<m)//手持100元的人還沒有全部入隊
		{
			c[t] = 'b';  //b代表手持100元的人
			Method(i,j+1,t+1);  //手持100元的人入隊,下標+1
		}
	}
	
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		m = in.nextInt();
		c = new char[n+m];     //隊形
		if(n>=m)         //只有n>m時,才符合要求,否則根本找不開零錢
		{
			Method(0,0,0);   //起始都是0
		}
		System.out.println(cnt);  //輸出隊形個數
	} 
}

運行結果:

輸入:

8 7

輸出:

1430

輸入:

15 12

輸出:

4345965

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章