#include<iostream> usingnamespacestd; int n, k, sum, ans; int a[40]; // i: 表示对 i 进行判断选还是不选; cnt: 当前已经选了多少数; s: 所选数的和 voiddfs(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]); } intmain(){ // 输入数据 cin >> n >> k >> sum; for (int i = 0; i < n; i++) { cin >> a[i]; } ans = 0; dfs(0, 0, 0); cout << ans << endl; return0; }
方法2
标记每个数的是否被选择,通过for循环去找一个没有被选择的元素进行dfs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int n, k, sum, ans = 0, a[110]; bool vis[110]; voiddfs(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; } } } }