子集和数的回溯算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计四

子集和数的回溯算法

班级通信08-2BF 学号1408230929 姓名杨福 成绩 分

一、 设计目的

1.掌握回溯法解题的基本思想;

2.掌握子集和数问题的回溯算法;

3.进一步掌握子集和数问题的回溯递归算法、迭代算法的基本思想和算法设计方法;

二、 设计内容

a) 任务描述

1)子集和数问题简介

子集和数问题是假定有n 个不同的正数(通常称为权),要求找出这些数中所有事的某和数为M 的组合。

2)设计任务简介

设计、编程、测试求解子集和数问题的回溯算法。

1. 子集和数问题的表示方案

本设计利用大小固定的元组来研究回溯算法,在此情况下,解向量的元素X (i )取1或0值,它表示是否包含了权数W (i ). 生成图中任一结点的儿子是很容易的。对于i 级上的一个结点,其左儿子对应于X (i )=1,右儿子对应于X(i)=0。对于限界函数的

一种简单选择是,当且仅当∑∑+==≥+

n

k i k i M i W i X i W 11)()()(时,B(X(1),〃〃〃,X (k ))=true 。

显然,如果这个条件不满足,X(1),〃〃〃,X (k )就不能导致一个答案结点。如果假定这些W (i )一开始就是按非降次序列排列的,那么这些限界函数可以被强化。在这种情

况下,如果M k W i X i W k

i >++∑=)1()()(1

,则X(1),〃〃〃,X (k )就不能导致一个答案结

点。因此,将要使用的限界函数是B

k (X (1),〃〃〃,X (k ))=true,当且仅当

M

i W i X i W n k i k i =+∑∑+==11)()()(。

2. 主要数据类型与变量

int M ; // 表示要求得到的子集和;

int s; // 表示所选当前元素之前所选的元素和;

int w[N]; // 存储原始集合的N个元素, 根据问题实例初始化;

int x[N]; // 变长表示的解向量, 不进行初始化;

3.算法或程序模块

#include

#define M 31

#define N 4 //集合元素个数

int w[N]={11,13,24,7};

int x[N];

void Subset(int s,int k) //解子集和数问题函数

{

int i,l;l=0; x[l]=k;

while(l>=0)

{

while(s+w[x[l]-1]

{

s=s+w[x[l]-1];

k++;l++;

x[l]=k;

}

while(s+w[x[l]-1]>M&&k<=N)

{

k++;x[l]=k;

}

if(s+w[x[l]-1]==M)

{ k++;

for(i=0;i<=l;i++)

printf(" %d",x[i]);//输出变长解向量

printf("\n");

}

while(k>N) //返回上一个节点,实现回溯的主要思想

{

l--;k=x[l];x[l]=k+1;s=0;

for(i=0;i

{

s=s+w[x[i]-1];

}

}

}

}

void main()

{

Subset(0,1);//调用subset(int s,int k)函数

}

二、测试

4.方案

在VC6.0中进行编译、运行以上程序,编译正确,运行正常。

5.结果

运行结果符合设计要求,达到预期的效果。

三、总结与讨论

这种列式使用大小固定的元组表示所有的解,得出一个问题的解可以有数种表示形式,而这些表示形式都是的所有的解是满足某些约束条件的多元组。回溯算法通过系统的检索给定问题的解空间来确定问题的解。这检索可以用这个解空间的树结构来简化。

对于一个给定的解空间,可能有多种树结构。

相关文档
最新文档