回溯法之子集树(0,1背包)
当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树。例如:0-1背包问题
子集树实例
//打印出vector的所有子集
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
void printVector(vector<int> array );
void dfs(vector<int>& array, int dep)
{
int size = array.size();
if(dep == size)
{
printVector(array);
return;
}
//dfs to the next level
//i的取值为0,1
for(int i = 0; i < 2; i++)
{
array[dep] = i;
dfs(array, dep+1);
}
}
void printVector(vector<int> array )
{
for(int i = 0; i <array.size(); i++)
cout << array[i]<< "\t" ;
cout << endl;
}
int main()
{
vector<int> b ;
//为b重新定义大小,5,并且初值为0
b.resize(5, 0);
dfs(b, 0);
return 0;
}
打印结果:
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 0 1 1
0 0 1 0 0
0 0 1 0 1
0 0 1 1 0
0 0 1 1 1
0 1 0 0 0
0 1 0 0 1
0 1 0 1 0
0 1 0 1 1
0 1 1 0 0
0 1 1 0 1
0 1 1 1 0
0 1 1 1 1
1 0 0 0 0
1 0 0 0 1
1 0 0 1 0
1 0 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 1 0
1 0 1 1 1
1 1 0 0 0
1 1 0 0 1
1 1 0 1 0
1 1 0 1 1
1 1 1 0 0
1 1 1 0 1
1 1 1 1 0
1 1 1 1 1