子集和数的回溯算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.结果 运行结果符合设计要求,达到预期的效果。 三、总结与讨论 这种列式使用大小固定的元组表示所有的解,得出一个问题的解可以有数种表示形式,而这些表示形式都是的所有的解是满足某些约束条件的多元组。回溯算法通过系统的检索给定问题的解空间来确定问题的解。这检索可以用这个解空间的树结构来简化。 对于一个给定的解空间,可能有多种树结构。