【備戰藍橋杯】【遞迴】【C語言】【排隊購票問題】
阿新 • • 發佈:2019-01-10
問題描述:
一: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)種排隊方式;
售票工作正在進行,每張票為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; }