数的划分 noip2001

来源:互联网 发布:华南理工大学绩点算法 编辑:程序博客网 时间:2024/05/17 05:53


将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5; 1,5,1; 5,1,1;

问有多少种不同的分法。

 

 

输入样例#1:
7 3


输出样例#1:
4

 

可以把这题看成 n 个数放进 k 个盒子里, 每个盒子里必须放数

于是有两种情况:

一、每个盒子要放的数都大于1

二、有至少1个盒子要放的数等于1

于是转移方程为

f[i][j] = f[i-j][j] + f[i-1][j-1]

代码如下

 

 

#include <cstdio>int n, k;int f[201][201];int main(){int i, j, t;scanf("%d%d", &n, &k);f[0][0] = 1; for(i = 1; i <= n; i++){for(j = 1; j <= k; j++){if(i >= j) f[i][j] = f[i-j][j] + f[i-1][j-1];}}//首先明确一点, 盒子不放 0 !!! //f[i-j][j]每个盒子都大于一,先每个盒子各放1,剩 i-j,放j个盒子//f[i-1][j-1],一个盒子只有1, 先在那个盒子放1, 剩i-1, 放j-1个盒子 printf("%d", f[n][k]);return 0;}