1. 程式人生 > >Contest1593 - 2018-2019賽季多校聯合新生訓練賽第三場(部分題解)

Contest1593 - 2018-2019賽季多校聯合新生訓練賽第三場(部分題解)

H 10255 自然數無序拆分

 

H 傳送門

題幹:

題目描述
    美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。
可是這道題目有一些難度,喜羊羊做了一會兒,見沸羊羊也十分頭疼,於是就來請教你。
題目是這樣的:
把自然數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(N
<=100) 輸出 無序拆分的種數。 樣例輸入 5 樣例輸出 7
View Code

題解:

  考察知識點:有關計數問題的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 
 9
int 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 }
View Code

題目來源:2009年慈溪市小學生計算機程式設計比賽