問題描述
每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。
每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。(兩個同樣需求的人(比如都是租鞋或都是還鞋)交換位置是同一種排法)
輸入格式
兩個整數,表示m和n
輸出格式
乙個整數,表示隊伍的排法的方案數。
思路
直接暴力窮舉,通過遞迴將長度為m+n的由0和1組成的序列全部窮舉出來,然後判斷序列是否符合題目要求。
**
#include
int length;
int ans;
int m;
int n;
void
check
(int arr)
if(arr[i]==1
)if(flag<0)
return;}
//printf("\n");
if(nn==n&&mm==m)ans++;}
void
dfs(
int arr,
int depth)
if(depth!=0)
arr[depth]=1
;dfs
(arr,depth+1)
;//return;
}int
main()
測試結果及分析
該題的測試用例資料較小,用暴力法可以通過所有測試用例。暴力法是沒有辦法的辦法,但還是要找尋最優解的。
思路
遞迴的核心思路:通過遞迴減小問題的規模。
我們記有m個還鞋子和n個租鞋子的人時的結果為fun(m,n),那麼fun(m-1,n)表示有m-1個人還鞋子和n個人租鞋子,fun(m,n-1)表示的是m個人還鞋子,n個人租鞋子。
得到遞推關係式:fun(m,n)=fun(m-1,n)+fun(m,n-1)
跳出遞迴的條件:1.m#include
intfun
(int m,
int n)
if(n==0)
return
fun(m,n-1)
+fun
(m-1
,n);
}int
main()
測試結果及分析
採用正常遞迴的方法,也通過了全部的測試用例。
這個方法的思路理解起來比較費勁。從我自己的理解來看,fun(m,n)代表乙個集合,集合裡面包含了多種排列,而排列的最後一位可能是0,也可能是1。若最後一位為0,則前面的排列情況為fun(m,n-1)。若最後一位為1,則前面的排列情況為fun(m-1,n)。這樣fun(m,n-1)+fun(m-1,n)就包含了fun(m,n)的所有可能解。
學習的路,任重而道遠。
希望我的部落格能對您有所幫助,同時歡迎演算法相關的討論與交流
藍橋杯 未名湖邊的煩惱 演算法訓練
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...
藍橋杯 演算法訓練 未名湖邊的煩惱
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...
未名湖邊的煩惱 藍橋杯演算法訓練題
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...