回溯法之子集和问题

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;

以上是关于回溯法之子集和问题的主要内容,如果未能解决你的问题,请参考以下文章

回溯法之排列组合

基础算法 分治法之合并排序

PTA7-3 子集和问题 (30 分) 回溯法

[LeetCode] 78. 子集 ☆☆☆(回溯)

递归与回溯9:子集问题-求子集

子集总和,带有回溯和类