你們必定小時候都作過不少奇奇怪怪的分水果的題目,好比7個小朋友分3個蘋果,切4刀怎麼分比較合理。c++
然而咱們今天要分的是車釐子,天然不可能把車釐子切開來分。事實上,負責分配車釐子的Gyy也很隨意,他只要能把給定的n個車釐子分紅k份就能夠了,根本不在意誰多誰少,請幫忙Gyy算一下,一共會有多少種分配方案。請注意,每份不能爲空,若是一種分法可以經過調換順序變成另外一種,那麼認爲他們是相同的,好比:spa
1,1,8;8,1,1;1,8,1;這三種分法視爲同一種方案。設計
輸入共一行,給出兩個整數n,k,其中6<n≤200,2≤k≤6。code
輸出共一行,即不一樣的分法的方案數。ci
7 3it
4程序設計
四種分法爲:1,1,5; 1,2,4; 1,3,3; 2,2,3。搜索
思路:本題的數據範圍很小,直接用搜索就能AC,時間複雜度O(n^k)。
但若是數據範圍稍微增大一些,顯然搜索就會超時!
所以能夠用一種巧妙的dp作法解決此問題。
狀態表示:dp[i][j]表示將i個車釐子分紅j個的方法數。
狀態轉移:咕咕咕。
代碼:程序
#include<bits/stdc++.h> #include<queue> using namespace std; int dp[200][10]; int main(){ int n,k; cin>>n>>k; for (int i=1; i<=n; i++) for (int j=1; j<=i; j++){ if (j==1 || j==i) dp[i][j]=1; else dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; } printf("%d",dp[n][k]); return 0; }