#include<stdio.h>
#include<iostream>
using namespace std;
int a[21];
int b[21];//记录取的数的下标
int n,k;
bool dfs(int x,int sum){
if(sum>k) return false;
if(x==n) return sum==k; //搜索到最深处
if(dfs(x+1,sum)) {
b[x]=0;
return true;
}
if(dfs(x+1,sum+a[x])){
b[x]=1; //取,做一个标记
return true;
}
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
if(dfs(0,0)) {
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
if(b[i]) {
cout<<a[i];
if(i!=n-1) cout<<" ";
}
}
}else {
cout<<"NO"<<endl;
}
}
C++求子集和问题
本文介绍了一个使用C++实现的子集和问题解决方案,通过深度优先搜索(DFS)算法来判断一组整数中是否存在一个子集,其元素之和等于给定的目标值。代码详细展示了如何递归地探索所有可能的子集组合,以及如何标记和输出找到的满足条件的子集。
355

被折叠的 条评论
为什么被折叠?



