[蓝桥杯][算法训练][vip] 数的划分(迭代搜索)

版权声明:原创博客,转载请标明出处! https://blog.csdn.net/caipengbenren/article/details/88585073

蓝桥杯 ALGO-22 算法训练 数的划分

问题描述
  将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
  例如:n=7,k=3,下面三种分法被认为是相同的。
  1,1,5; 1,5,1; 5,1,1;
  问有多少种不同的分法。
输入格式
  n,k
输出格式
  一个整数,即不同的分法
样例输入
7 3
样例输出
4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
数据规模和约定
  6<n<=200,2<=k<=6


这一题有一点迭代搜索的味道。

首先我们要理解划分的意思,举个例子,把5划分成2部分,那第一部分就只能取1和2,为什么?如果当你取3的话,第二个数就只能取2,这样就会出现重复。所以为了避免重复同时也加快算率。我们只能取 first 到 n/k的数。

其次就是,要知道最后一个数是不需要划分的,我们直接用总数减去之前的数即可。
所以终点判断为k == 1


#include<iostream>
using namespace std;
int cnt = 0;
void dfs(int first, int num, int k) {
    if(k == 1) {
        cnt ++;
        return;
    }
    for (int i = first; i <= num / k; i++) {
        dfs(i, num - i, k - 1);
        
    }
}
int main () {
    int n, k;
    cin  >> n >> k;
    dfs(1, n, k);
    cout << cnt;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/caipengbenren/article/details/88585073