子集和问题 回溯法求解

 子集和问题的一个实例为<S,c>。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。
    试设计一个解子集和问题的回溯法。
回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的 基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于 搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
#include <stdio.h>
int flag,sum=0;
int *s, *x, n,c;


void backtrack(int t)
{
	int i;
	if(t==n)
	{
		if(sum==c)
		{
			flag=1;
			for(i=0;i<n;i++)
				if(x[i])
					printf("%3d",s[i]);

			printf("\n");
			return;
		}
	}
	else
	{
		sum+=s[t];
		x[t]=1;
		backtrack(t+1);
		x[t]=0;
		sum-=s[t];
		backtrack(t+1);
	}
}

int main()
{

	int i;

	scanf("%d%d",&n,&c);
	s=new int [n];
	x=new int[n];

	for(i=0;i<n;i++){
		scanf("%d",&s[i]);
		x[i]=0;
	}

	backtrack(0);

	if(flag)
		printf("yes");
	else 
		printf("no");

	return 0;
}

定义解空间类似于这种图法 :

暴力法也称为穷举法、

蛮力法,

它要求调设计者找出所有可能的方法,

然后选择其中的

一种方法,若该方法不可行则试探下一种可能的方法。

 

暴力法也是一种直接解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。

 

暴力法不是一个最好的算法,

但当我们想不出更好的办法时,

它也是一种有效的解决问

题的方法。

 

暴力法的优点是逻辑清晰,编写程序简洁。在程序设计竞赛时,时间紧张,

相对于高效

的、巧妙的算法,暴力法编写的程序简单,能更快地解决问题。同时蛮力法也是很多算法的

基础,可以在蛮力法的基础上加以优化,得到更高效的算法。

 

而且,

某些情况下,

算法规模不大,

使用优化的算法没有必要,而且某些优化算法本身

较复杂,在规模不在时可能因为复杂的算法浪费时间,反而不如简单的暴力搜索。

 

使用暴力法常用如下几种情况:

 

1

)搜索所有的解空间;

 

2

)搜索所有的路径;

 

3

)直接计算;

 

4

)模拟和仿真

暴力法也称为穷举法、

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值