数的划分
ybtoj DP-1-1
题目大意
给你一个n,让你分成k份,问有多少种分法(1,2和2,1为同一种)
输入样例
7 3
输出样例
4
样例解释
四种分法为:1,1,5;1,2,4;1,3,3;2,2,3.1,1,5; \ \ 1,2,4; \ \ 1,3,3; \ \ 2,2,3.1,1,5; 1,2,4; 1,3,3; 2,2,3.
数据范围
6<n⩽200,2⩽k⩽66<n\leqslant 200,2\leqslant k\leqslant 66<n⩽200,2⩽k⩽6
解题思路
可以让生成序列单调递减,使其不重复
如果让其单调递减,那只有两种操作:
1.新增1份,里面有1
2.前i份全部加1
这样保证后面的加了前面的也一定会加
fi,j=fi,j−i+fi−1,j−1f_{i,j}=f_{i,j-i}+f_{i-1,j-1}fi,j=fi,j−i+fi−1,j−1
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, k, f[10][210];
int main()
{scanf("%d%d", &n, &k);f[0][0] = 1;for (int i = 1; i <= k; ++i)for (int j = i; j <= n; ++j)f[i][j] = f[i][j - i] + f[i - 1][j - 1];//递推printf("%d", f[k][n]);return 0;
}