zoukankan      html  css  js  c++  java
  • 子集和问题【回溯法】

     子集和问题的一个实例为<S,c>。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。
        试设计一个解子集和问题的回溯法。


    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1005;
    int n,c;
    int s[maxn];
    int cnt=0,sum=0;
    int vis[maxn];
    int flag=0;
    void solve(int x){
        if(flag) return ;//找到一组解就返回
        if(sum==c){
            flag=1;
            for(int i=0;i<n;i++){
                if(vis[i]) printf("%d ",s[i]);//打印输出可行解
            }
            printf("
    ");
            return;
        }else{
            sum+=s[x];
            vis[x]=1;
            solve(x+1);
            vis[x]=0;//回溯时要还原
            sum-=s[x];
            solve(x+1);
        }
    }
    int main()
    {
        scanf("%d%d",&n,&c);
        for(int i=0;i<n;i++){
            scanf("%d",&s[i]);
        }
        solve(0);
        if(!flag) printf("No Solution
    ");
        return 0;
    }
    /*
    5 10
    2 2 6 5 4
    */
    

  • 相关阅读:
    break return continue
    爬虫---请求
    pycharm加开头注释
    爬虫---入门
    pip
    XML基础
    英语
    布局
    adobe
    StackOverflow
  • 原文地址:https://www.cnblogs.com/kzbin/p/9205200.html
Copyright © 2011-2022 走看看