1.求子集和问题的解
该问题的解空间树是一棵子集树。
设解向量x=(x1,x2,…,xn),这里是求所有满足目标条件的解,所以一旦搜索到叶子结点(即i>n),如果相应的子集和为W,则输出x解向量。
#include<stdio.h>
#define MAXN 20
int n=4,W=31;
int w[]={0,11,13,24,7};
int count=0;
void dfs(int i,int tw,int rw,int x[]){
if(i>n){
if(tw==W) dispasolution(x);
}
else {
if(tw+w[i]<=W) {
x[i]=1;
dfs(i+1,tw+w[i],rw-w[i],x);
}
if(tw+rw-w[i]>=W) {//包含等于
x[i]=0;
dfs(i+1,tw,rw-w[i],x);
}
}
}
int main(){
int x[MAXN];
int rw=0;
for(int i=1;i<=n;i++) rw+=w[i];
dfs(1,0,rw,x);
}
算法的解空间树中有2^ n+1 - 1个结点,最坏情况下算法的时间复杂度为O(2^n)。