Contest1593 - 2018-2019赛季多校联合新生训练赛第三场(部分题解)
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(N<=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 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 }
题目来源:2009年慈溪市小学生计算机程序设计比赛