• 子集和问题 (回溯搜索)


    子集和问题
    【问题描述】
           子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得子集S1和等于c。
    【编程任务】
           对于给定的正整数的集合S={ x1, x2,…, xn}和正整数c,编程计算S 的一个子集S1,使得子集S1和等于c。
    【输入格式】
           由文件subsum.in提供输入数据。文件第1行有2个正整数n和c,n表示S的个数,c是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。
    【输出格式】
           程序运行结束时,将子集和问题的解输出到文件subsum.out中。当问题无解时,输出“No solution!”。
    【输入样例】
    5  10
    2  2  6  5  4
    【输出样例】
    2  2  6
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int a[100];
    int print(int);
    int search(int,int);
    int ans[100],count[100];
    int n,s,js;
    int main()
    {

    scanf("%d%d",&n,&s);
    for(int i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);
    count[a[i]]++;
    }

    search(1,s);//从第一个元素开始找
    if(js==0)printf("no,solution");//没出现
    return 0;
    }
    int print(int x)
    {
    js++;
    for(int i=1;i<=x;i++)
    printf("%d ",ans[i]);
    printf(" ");
    }
    int search(int x,int s)
    {
    for(int i=1;i<=n;i++)
    {
    if(a[i]<=s&&count[a[i]])
    {
    s-=a[i];
    count[a[i]]--;
    ans[x]=a[i];
    if(s==0)print(x);
    else search(x+1,s);//找第二个且满足和减去第一个
    s+=a[i];
    //count[a[i]]++ 不回溯就不会重复,如4 6和6 4。。。。
    ans[x]=0;
    }
    }
    }

  • 相关阅读:
    Codeforces Beta Round #92 (Div. 2 Only) B. Permutations 模拟
    POJ 3281 Dining 最大流 Dinic算法
    POJ 2441 Arrange the BUlls 状压DP
    URAL 1152 Faise Mirrors 状压DP 简单题
    URAL 1039 Anniversary Party 树形DP 水题
    URAL 1018 Binary Apple Tree 树形DP 好题 经典
    pytorch中的forward前向传播机制
    .data()与.detach()的区别
    Argparse模块
    pytorch代码调试工具
  • 原文地址:https://www.cnblogs.com/zzyh/p/6609505.html
Copyright © 2020-2023  润新知