题目
给定N个正整数,找到一个子集和等于m。注:这N个数可能存在重复的元素
代码
using namespace std;
const int N=510;
bool st[N];//判断这个数是否被访问过
int b[N];//记录所有可选择的数
int n,m;//输入数的数量,要求组成的数
void dfs(int left_num,int k){
if(left_num==0) {//如果此时恰好组成m,输出
for(int i=1;i<=n;i++){
if(st[i]) cout<<b[i]<<" ";
}
cout<<endl;
return;
}
for(int i=k+1;i<=n;i++){
left_num-=b[i];
st[i]=true;
dfs(left_num,i);
st[i]=false;
left_num+=b[i];
}//回溯并剪枝
return ;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>b[i];
sort(b+1,b+1+n);//从小到大将其排序
dfs(m,0);
return 0;
}
这篇文章介绍了一种利用深度优先搜索(DFS)解决在给定的包含可能重复元素的正整数数组中找到和为m的子集的问题。代码中通过回溯和剪枝优化了搜索过程,并对数组进行了排序以提高效率。
6624

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



