回溯法之子集和问题
Posted miracle沈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯法之子集和问题相关的知识,希望对你有一定的参考价值。
问题描述:
子集和问题的一个实例为<S,M>。其中S=x1,x2,…,xn是一个正整数的集合,M是一个正整数。找出S的所有子集S1,使得S1中所有元素的和为M。试设计一个解子集和问题的回溯法。
样例输入:
5 10 12 13 15 18
30
样例输出:
5 10 15
5 12 13
12 18
样例说明:
输入第一行是集合S,第二行是整数M;输出每一行代表一个解
#include <iostream>
using namespace std;
int s[100],n;
int m;
int flag[100];//标记被使用的元素,便于输出
int sum=0;//临时的子集和
void dfs(int t)
if(sum==m)
for(int i=0;i<n;i++)
if(flag[i])
cout<<s[i]<<" ";
cout<<endl;
else if(sum>m||t>=n)//剪枝函数
return;
else
flag[t]=1;
sum+=s[t];
dfs(t+1);
flag[t]=0;
sum-=s[t];
dfs(t+1);
int main()
int x,i=0;
while(cin>>x)
s[i++]=x;
if(cin.get()=='\\n')
break;
n=i;
cin>>m;
dfs(0);
return 0;
以上是关于回溯法之子集和问题的主要内容,如果未能解决你的问题,请参考以下文章