子集和问题之回溯法

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

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;

}

 

    原文作者:回溯法
    原文地址: https://blog.csdn.net/zuiqingxuan/article/details/82669533
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞