子集和问题之回溯法

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的 基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于 搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过 程中动态产生的,这是回溯算法的一个重要特性。
#include <stdio.h>
#include <stdlib.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;
	printf("请输入要求解问题S的大小n和子集和的目标值c:"); 
	scanf("%d%d",&n,&c);
	s=(int *)malloc(sizeof(int)*n) ;
	x=(int *)malloc(sizeof(int)*n);
	printf("请输入集合S中的%d个正整数元素:",n); 
	for(i=0;i<n;i++){
		scanf("%d",&s[i]);
		x[i]=0;
	}
	backtrack(0);
	if(flag)
		printf("yes");
	else 
		printf("no");
	free(s);
	free(x);
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/qq_40685275/article/details/80882630