Contest1593 - 2018-2019賽季多校聯合新生訓練賽第三場(部分題解)
阿新 • • 發佈:2018-12-09
H 10255 自然數無序拆分
題幹:
題目描述 美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。 可是這道題目有一些難度,喜羊羊做了一會兒,見沸羊羊也十分頭疼,於是就來請教你。 題目是這樣的: 把自然數N(N<=100)分解為若干個自然數之和,求出有幾種情況。 如N=5時,有7種情況 5=1+1+1+1+1 5=1+1+1+2 5=1+1+3 5=1+2+2 5=1+4 5=2+3 5=5 怎麼樣?你要加油幫助喜羊羊哦! 輸入 一個自然數N(NView Code<=100) 輸出 無序拆分的種數。 樣例輸入 5 樣例輸出 7
題解:
考察知識點:有關計數問題的DP
求自然數n的無序拆分的種數可以轉化成求"n的劃分種數"
AC程式碼:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=100+10; 5 6 int n; 7 int dp[maxn][maxn];//dp[i][j] : j的i劃分方案數 8 9View Codeint main() 10 { 11 scanf("%d",&n); 12 dp[0][0]=1; 13 for(int j=0;j <= n;++j) 14 for(int i=1;i <= n;++i) 15 if(j < i)//當j不足矣劃分成i份時 16 dp[i][j]=dp[i-1][j]; 17 else//dp[i-1][j] : 含ai=0的劃分總方案數,dp[i][j-i] : 不含ai=0的總方案數 18 dp[i][j]=dp[i-1][j]+dp[i][j-i]; 19 printf("%d\n",dp[n][n]); 20 21 return 0; 22 }
題目來源:2009年慈溪市小學生計算機程式設計比賽