回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
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;
}