H 10255 自然数无序拆分
题干:
题目描述
美羊羊给喜羊羊和沸羊羊出了一道难题,说谁能先做出来,我就奖励给他我自己做的一样礼物。沸羊羊这下可乐了,于是马上答应立刻做出来,喜羊羊见状,当然也不甘示弱,向沸羊羊发起了挑战。
可是这道题目有一些难度,喜羊羊做了一会儿,见沸羊羊也十分头疼,于是就来请教你。
题目是这样的:
把自然数N(N<=)分解为若干个自然数之和,求出有几种情况。
如N=5时,有7种情况
=++++
=+++
=++
=++
=+
=+
=
怎么样?你要加油帮助喜羊羊哦! 输入
一个自然数N(N<=) 输出
无序拆分的种数。 样例输入 样例输出
题解:
考察知识点:有关计数问题的DP
求自然数n的无序拆分的种数可以转化成求"n的划分种数"
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=+; int n;
int dp[maxn][maxn];//dp[i][j] : j的i划分方案数 int main()
{
scanf("%d",&n);
dp[][]=;
for(int j=;j <= n;++j)
for(int i=;i <= n;++i)
if(j < i)//当j不足矣划分成i份时
dp[i][j]=dp[i-][j];
else//dp[i-1][j] : 含ai=0的划分总方案数,dp[i][j-i] : 不含ai=0的总方案数
dp[i][j]=dp[i-][j]+dp[i][j-i];
printf("%d\n",dp[n][n]); return ;
}
题目来源:2009年慈溪市小学生计算机程序设计比赛