洛谷 P1025 数的划分 递推

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_Du/article/details/86682150

题目链接:点我跳转
题目大意:将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序),求方案数
题目分析:可以用递归,先给出递归公式吧,将n划分为k份,每份都比m大,方案数为 [ n , k , m ] [n,k,m]
[ n , k , m ] = [ n m , k 1 , m ] + [ n , k , m + 1 ] [n,k,m]=[n-m,k-1,m]+[n,k,m+1]
下面解释一下:
我们从 [ n , k , 1 ] [n,k,1] 开始递归,先分出一个最小的m来,那么剩下n-m个分成k-1份,每份仍然都比m大,这便是 [ n m , k 1 , m ] [n-m,k-1,m]
下面我们将分出的第一个数大一点变成m+1,这便是 [ n , k , m + 1 ] [n,k,m+1]

递推边界:

如果将n等k份仍比m小,方案数为0;
如果只能分成一份,方案数为1;
如果 n = 1,方案数为1;
如果将n等k份恰好为m,方案数为1;

#include<iostream>
using namespace std;

int find (int n,int k,int m){
    if(k*m > n)return 0;//递推边界
    if(n == 1 || k == 1 || k*m == n)return 1;//递推边界
    return find(n-m,k-1,m) + find(n,k,m+1);//递推公式
}

int main(){
    int n,k;
    cin>>n>>k;
    cout<<find(n,k,1); 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/happy_Du/article/details/86682150
今日推荐