当前位置:   article > 正文

回溯法求给定集合的子集和_能否找到一个子集使其合为c

能否找到一个子集使其合为c

对于给定的正整数集合S={w_1,w_2,……,w_n}和正整数C, 编写程序计算S的一个子集S1,使得S1的和为C。
输入要求:输入的第1行为两个整数C和N,分别表示子集S1的和和元素的个数。第2行有N个整数,表示该集合中的每一个元素,1≤N≤10000。
输出要求:当问题有解时输出构成该子集的每个元素;当问题无解是输出“No Solution!”。
样例输入:
5 3
2 2 6 5 4
样例输出:
No Solution!
如果只需要求出一个满足和为C的子集

#include<stdio.h>
#define M 10000
int n[M];
int out[M]={0};
int N,C;
int flag=0;
int sum=0;
void solve(int i)
{
	if(sum==C)
	{
		flag=1;
		return ;
	}
	if(flag==1||i>=N)
		return ;
	sum+=n[i];
	if(sum<=C)//直接遍历左子树
	{
		out[i]=1;
		solve(i+1);
	}
	else{//直接遍历右子树
	sum-=n[i];
	solve(i+1);
	return;
	}
	if(flag==0)
	/*从左子树返回后遍历右子树,而flag=0表示没有找到合适子集,
	而若是找到了满足要求的子集就结束对剩余树的遍历直接返回以便节省时间。
	因此若是需要求得所有和为C的子集就去掉这里的flag条件使得程序可以遍历整棵树*/
	{
		sum-=n[i];
		out[i]=0;
		solve(i+1);
	}
	return;
}
int main()
{

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/304036
推荐阅读
相关标签
  

闽ICP备14008679号