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才能通过
分享到:
相关推荐
子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,...,xn}是一个正整数的集合,c 是一个正整数。子集和问题判定是否存在S的一个子集S1,使得x∈S1,∑x=c. 试设计一个解子集和问题的回溯法...
子集和问题的一个实例为?St?〈St〉。其中,S={x1,x2,…,xn}S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在 S 的一个子集 S1,使得 ∑x∈S1x=c ∑x∈S1x=c。试设计一个解子集和...
回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...
### 子集和问题解析与实现 #### 一、子集和问题介绍 子集和问题(SubSet Sum Problem)是一个经典的计算机科学问题,在算法设计、数据结构、甚至密码学等领域都有广泛的应用。该问题的基本形式是:给定一组整数和一...
5-1 子集和问题 问题描述:子集和问题的一个实例为,t>。其中,S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数 。 子集和问题判定是否存在S 的一个子集S1,使得子集里的元素之和为c 试设计一个解子集和问题的...
在计算机科学领域,子集和问题是一个重要的研究课题,它不仅在理论上有其独特的价值,而且在实际应用中也具有广泛的意义。8603子集和问题作为该领域的经典问题之一,吸引了众多研究人员的关注。该问题的实质是,在...
### 算法设计与分析:子集和问题 #### 问题定义 子集和问题是一种经典的计算机科学问题,属于NP完全问题。该问题的基本形式是:给定一个正整数集合\( S=\{x_1,x_2,…,x_n\} \)和一个正整数\( c \),询问是否存在...
子集和问题C++.txt
算法分析课程作业,C语言编写,可能需要用input.txt输入,子集和问题代码
实现5-1子集和问题.cpp
子集和。近似算法能够获得近似值和近似解,并且是一种完全多项式时间近似方案。 包括指数时间算法、修整算法、近似算法,可以获得近似值和近似解