小韦老师@神犇营-my1065-数的划分

小韦老师@神犇营-my1065-数的划分

题目:

描述

将整数 n 分成 k 份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,这三种分法被认为是相同的:
① 1, 1, 5;
② 1, 5, 1;
③ 5, 1, 1。
问有多少种不同的分法。

输入

输入仅一行,为两个整数 n,k (6 < n <= 200,2 <= k <= 6)。

输出

一个整数,即不同的分法的种数。

输入样例1

7 3

输出样例1

4

题解:

破题:

对于每个整数而言,分成的每一份都必须是整数。

思路:

从 1 往大枚举整数,对于当前整数都有两种选择,选或者不选,比如当选了当前整数之后,现在会达到另一个状态,在此状态基础上,下一个数仍然面临两个选择,选或者不选,同样也会达到另外一个状态;若当前数不选,也是同样的状况。而每次选完数之后,需要判断选的数是否为K个,若是,则要判断这些数的和是否为n,若是,则计数器加1即可。

完整代码:

#include <bits/stdc++.h>

using namespace std;
 
int n, k, ans;
 
void dfs(int cnt, int sum, int last) {
    if(cnt == k) {
        if(sum == n) {
            ans++;
        }
        return;
    }
    for(int i = last; i <= n - sum; i++) {
    	sum += i;
        dfs(cnt + 1, sum, i);
        sum -= i;
    }
}
 
int main() {
    cin >> n >> k;
    dfs(0, 0, 1);
    cout << ans;
 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_31790997/article/details/92086198