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年慈溪市小学生计算机程序设计比赛

  

猜你喜欢

转载自www.cnblogs.com/violet-acmer/p/10090415.html
今日推荐