求解子集和问题的解
题目描述:
给定有n个不同正整数的集合w=(w1,w2,… ,wn)和一个正数W,要求找出w的子集s,式该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)
分析思路:
n=4时,解空间树如图(结点中的数字是结点的编号,例如结点18对应解向量为(1,1,0,1),选择的整数和=11+13+7=31),从i层到i+1层(1<=i<=n)的每一条边标有xi的值,xi或者为1或者为0,xi为1时表示取wi为整数,xi为0时表示不去wi为整数,从根节点到叶子结点的所有路径定义了解空间。
时间复杂度 O(2^n),解空间树中有 2^ (n+1) -1个结点

求解该问题需要搜索整个解空间树,设解向量x=(x1,x2,…,xn),本问题是求所有解,所以一旦搜索到叶子结点(即i=n+1),如果相应的子集和为W,则输出x解向量。搜索到第i(1<=i<=n)层的某个结点时用tw表示选取的整数和,rw表示余下的整数和,rw表示余下的整数和,rw=w[j] (j从i+1到n)
(1)约束函数:检查当前整数w[i]加入子集和是否超过W,若超过,则不能选择该路径。用于左孩子结点剪枝。
(2)限界函数:一个结点满足tw+rw<W,即即使选择剩余的所有整数,也不可能找到一个解。用于右孩子剪枝。
代码:
#include<stdio.h>
#define MAXN 20
int n=4,W=31;
int w[]={
0,11,13,24,7}<

本文介绍了一种解决子集和问题的方法,通过构建解空间树并使用递归深度优先搜索算法来寻找所有可能的子集,使得这些子集的元素之和等于给定的目标值。文中详细解释了约束函数和限界函数的应用,并提供了完整的C语言实现代码。
295

被折叠的 条评论
为什么被折叠?



