洛谷 P1025 数的划分
题目描述
将整数 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,1,5 ;
1,2,4 ;
1,3,3 ;
2,2,3 .
思路:dfs搜索 或 递推
#include<algorithm> #include<cstdio> using namespace std; int n, m, s; int a[15]; void dfs(int k) { if(n == 0) return; if(k == m) { if(n >= a[k-1]) s++; return; } for(int i = a[k-1]; i <= n/(m-k+1); i++) { a[k] = i; n -= i; dfs(k+1); n += i; } } int main() { scanf("%d%d", &n, &m); a[0] = 1; dfs(1); printf("%d\n", s); return 0; }