`
Kingson_Wu
  • 浏览: 123549 次
文章分类
社区版块
存档分类
最新评论

子集和问题

 
阅读更多
8603 子集和问题
时间限制:1000MS 内存限制:1000K 提交次数:0 通过次数:0
语言: not limited
描述
S是一个整数集合,S={x1,x2,...,xn},c是一个整数。这里集合元素xi(1<=i<=n)和c都是整数,可能为负。子集和问题就是:判断是否存在S的一个子集S1,使得:
对S集合子集树采用深度优先的顺序进行搜索,子集树从上到下每层标示着S集合中每个从左到右元素“选”或者“不选”(左1右0)。试着用回溯算法设计解子集和问题。
输入格式
30
第一行2个数:正整数n和整数c。n表示S集合的大小,c是子集和的目标值,接下来一行中,有n个整数,表示集合S中的元素。
输出格式
将子集和问题的解输出,当无解时,输出"No Solution"(注意No Solution的大小写,空格,无标点)。
注意:依据S集合元素从左到右依次来画子集树,因此子集树唯一。若存在多种子集和问题的解时,只输出在这个唯一的子集树按深度优先方向遇到的第一个解,这样保证解的唯一性,利于评判。如:5 10 2 2 6 3 3 这里,2+2+6=10,2+2+3+3=10,但只输出2 2 6 如:5 10 2 2 3 3 6 只输出2 2 3 3 又如:5 -30 2 -2 6 -30 -3 只输出2 -2 -30
输入样例
5 10
2 2 6 5 4
输出样例
2 2 6
Hint
解空间树是“子集树”。
回溯法搜索,由于是深度优先的找,找到就退出算法。

------------------------------------------------------------------------

#include<iostream>
#include<malloc.h>
using namespace std;
//找到一个解立即退出所有递归
template<class Type>
class Loading{
    friend int* MaxLoading(Type [],Type,int,int*,int &);
private:
    void Backtrack(int i);
    int n,*x,flag;
    Type *w,sum,cw;
};
template<class Type>
void Loading<Type>::Backtrack(int i)
{
    if(i>n)
        return;
    if(flag) return;
    if(1){
        cw+=w[i];
        x[i]=1;
        if(cw==sum)
        {flag=1; return; }
        Backtrack(i+1);
        if(flag) return;//关键一步。。。
        cw-=w[i];
        x[i]=0;
    }
    Backtrack(i+1);
}
template<class Type>
int* MaxLoading(Type w[],Type sum,int n,int* x,int& flag)
{
    Loading<Type>X;
    X.w=w;
    X.x=x;
    X.sum=sum;
    X.n=n;
    X.cw=0;
    X.flag=0;
    X.Backtrack(1);
    flag=X.flag;
    return X.x;
}
int main()
{
    int n,sum,i;
    int *w,*x,flag=0;
    cin>>n>>sum;
    w=(int*)malloc((n+1)*sizeof(int));
    x=(int*)malloc((n+1)*sizeof(int));
    for(i=1;i<=n;i++)
    {cin>>w[i];
        x[i]=0;
    }
    x=MaxLoading(w,sum,n,x,flag);
    for(i=1;i<=n;i++)
    {
        if(x[i]==1)
            cout<<w[i]<<" ";
    }
    if(flag==0)
        cout<<"No Solution";
    return 0;
}
//用VC才能通过




分享到:
评论

相关推荐

    子集和问题子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,...,xn}是一个正整数的集合,c

    子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,...,xn}是一个正整数的集合,c 是一个正整数。子集和问题判定是否存在S的一个子集S1,使得x∈S1,∑x=c. 试设计一个解子集和问题的回溯法...

    5-1+_子集和问题_

    子集和问题的一个实例为?St?〈St〉。其中,S={x1,x2,…,xn}S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在 S 的一个子集 S1,使得 ∑x∈S1x=c ∑x∈S1x=c。试设计一个解子集和...

    回溯法求解子集和问题

    回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...

    子集和问题(算法设计,acm)

    ### 子集和问题解析与实现 #### 一、子集和问题介绍 子集和问题(SubSet Sum Problem)是一个经典的计算机科学问题,在算法设计、数据结构、甚至密码学等领域都有广泛的应用。该问题的基本形式是:给定一组整数和一...

    算法设计实现题子集和问题c实现

    5-1 子集和问题 问题描述:子集和问题的一个实例为,t&gt;。其中,S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数 。 子集和问题判定是否存在S 的一个子集S1,使得子集里的元素之和为c 试设计一个解子集和问题的...

    8603子集和问题

    在计算机科学领域,子集和问题是一个重要的研究课题,它不仅在理论上有其独特的价值,而且在实际应用中也具有广泛的意义。8603子集和问题作为该领域的经典问题之一,吸引了众多研究人员的关注。该问题的实质是,在...

    算法设计与分析-子集和问题

    ### 算法设计与分析:子集和问题 #### 问题定义 子集和问题是一种经典的计算机科学问题,属于NP完全问题。该问题的基本形式是:给定一个正整数集合\( S=\{x_1,x_2,…,x_n\} \)和一个正整数\( c \),询问是否存在...

    子集和问题C++.txt

    子集和问题C++.txt

    子集和问题代码

    算法分析课程作业,C语言编写,可能需要用input.txt输入,子集和问题代码

    实现5-1子集和问题.cpp

    实现5-1子集和问题.cpp

    完全多项式时间近似算法(子集和问题)

    子集和。近似算法能够获得近似值和近似解,并且是一种完全多项式时间近似方案。 包括指数时间算法、修整算法、近似算法,可以获得近似值和近似解

Global site tag (gtag.js) - Google Analytics