K个数的和

从 n 个数中选 k 个数的和为 sum 这个问题。

方法1

用一个参数来表示对那个元素进行判断,对每一个状态有选和不选2种路径

#include <iostream>
using namespace std;
int n, k, sum, ans;
int a[40];
// i: 表示对 i 进行判断选还是不选; cnt: 当前已经选了多少数;  s: 所选数的和
void dfs(int i, int cnt, int s) { 
    if (i == n) {
        if (cnt == k && s == sum) {
            ans++;
        }
        return;
    }
    dfs(i + 1, cnt, s);
    dfs(i + 1, cnt + 1, s + a[i]);
}
int main() {
    // 输入数据
    cin >> n >> k >> sum;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    ans = 0;
    dfs(0, 0, 0);
    cout << ans << endl;
    return 0;
}

方法2

标记每个数的是否被选择,通过for循环去找一个没有被选择的元素进行dfs

int n, k, sum, ans = 0, a[110];
bool vis[110];
void dfs(int cnt, int s) {
    if (cnt == n) {
        if (s = sum) {
            ans++;
        }
        for (int i = 0; i < n; i++) {
            if (!vis[i]) {
                vis[i] = true;
                dfs(cnt + 1, s + a[i]);
                vis[i] = false;
            }
        }
    }
}