# dfs1

给定 n 个整数,要求选出 K 个数,使得选出来的 K 个数的和为 sum; 求一下有多少种情况;

#include <iostream>
using namespace std;
//n 代表一共多少个数,k 代表需要选的的数个数,sum 代表当前累加的数,ans 表示有多少种情况
int n, k, sum, ans;
int a[40];
//cnt 当前累加的个数; s = 当前累加的数之和
void dfs(int i, int cnt, int s) {
	if (i == n) {
		if (cnt == k && s == sum) {
			ans++;
		}
	}
	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;
}
#include<iostream>
using namespace std;
int n, k, sum, ans;
int a[40];
bool xuan[40];
void dfs(int s, int cnt){
    if(s == sum && cnt == k){
        ans++;
    }
    for(int i = 0;i < n;i++){
        if(!xuan[i]){
            xuan[i] = 1;
            dfs(s+a[i],cnt+1);
            xuan[i] = 0;
        }
    }
}
int main(){
    cin >> n >> k >> sum;
    for(int i = 0; i < n ; i++){
        cin >> a[i];
    }
    ans = 0;
    dfs(0,0);
    return 0; 
}

第二种会显示 12,因为组合 2,3,5 和 3,2,5 和 5,3,2 等当成了不同方法。等待优化

从 0 到 29 这 30 个数中选出 8 个数,使其和值为 200;

#include<iostream>
using namespace std;
int n, k, sum, ans;
int a[40];
void dfs(int i, int cnt, int s) {
	if (cnt > k) {
		return;
	}if (s > sum) {
		return;
	}
	if (i == n && cnt == k && s == sum) {
	ans++;
	}
	dfs(i + 1, cnt,s);
	dfs(i + 1, cnt+1,s + a[i]);
}
int main() {
	n = 30;
	k = 8;
	sum = 200;
	for (int i = 0; i < 30; i++) {
		a[i] = a[i] + 1;
	}
	ans = 0;
	dfs(0, 0, 0);
	cout << ans << endl;
	return 0;
}

# dfs2

输入整数 n, 表示木棍数量 (3 < n <= 10),接下来输入 n 根木棍的长度 pi (1 < pi < 10000), 看是否能装出等边三角形。

#include <iostream>
using namespace std;
int p[15];
bool vis[15];
int n,sum = 0;
bool f;
void dfs(int cnt, int s, int st){
    if(f){
        return;
    }
    if(cnt == 3){
        f == true;
        return;
    }
    if(sum = sum/3){
        dfs(cnt+1,0,0);
        return;
    }
    for(int i = 0;i < n; i++){
        if(!vis[i]){
            vis[i] = true;
            dfs(p,s+p[i],i+1);
            vis[i] = false
        }
    }
}
int main(){
  
    scanf("%d",&n);
    
    for(int i = 0; i < n; i++{
        scanf("%d",&p[i]);
        sum += p[i];
    }
    if(sum % 3 != 0) cout << "nono" << endl;
    else{
        dfs(0,0,0);
        if(f){
             cout << "yesyes";
        }
        else{
            cout << "nono"; 
        }
    }
    return 0;
}
memset(dp,0,sizeof(dp))
更新于