题目描述
将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1.
问有多少种不同的分法。
输入格式
n,k (6<n≤200,2≤k≤6)
输出格式
1 个整数,即不同的分法。
输入输出样例
输入 #1
7 3
输出 #1
4
说明/提示
四种分法为:
1,1,5;
1,2,4;
1,3,3;
2,2,3.
【题目来源】
NOIP 2001 提高组第二题
分析
这道题其实也可以用递推来做。
递推式为 f[i][j]=f[i-1][j-1]+f[i-j][j];
f[i][j]=f[i-1][j-1];
AC代码
#include<bits/stdc++.h>//减少引用头文件数的万能头文件(但会慢一些) using namespace std;//使用标准命名空间 int f[205][10];因为是递推,所以这个数组用于存储总数 int main()//没有其它函数 { int n,k; cin>>n>>k;//输入数据 for(int i=1;i<=n;i++) { f[i][1]=1;//初始化 f[i][0]=1; } for(int i=2;i<=k;i++) { f[1][i]=0; f[0][i]=0; } for(int i=2;i<=n;i++) { for(int j=2;j<=k;j++) { if(i>j)// f[i][j]=f[i-1][j-1]+f[i-j][j];//总数累加 else f[i][j]=f[i-1][j-1]; } } cout<<f[n][k];//在递推中的数据输出 return 0; }
本文介绍了一种基于递推的算法来计算整数n分成k份的不同组合数,展示了C++代码实现。
1183

被折叠的 条评论
为什么被折叠?



