回溯法:实质先序遍历一个“状态树”的过程。回溯法:子集树与排列树
子集树:当所给问题是从含有n个元素的集合S中找出满足某种性质的子集,解空间是子集树。
排列树:当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树。
现有整型数组{1,2,4,3,5,8},写出一个函数,找出所有和为10的集合。(回溯法:子集树)
子集树算法程式:
void backtrack(int i, int n)
{
if (i > n)
output();
else
{
for (int i = 0; i <= 1; ++i)
{
取第i个元素; backtrack((i+1, n);
舍第i个元素: backtrack(i+1, n);
}
}
}
public class Test
{
static int x[] = new int[100];
public static void main(String args[])
{
int s[] = {1,2,3,4,5,6,7};
subSet(0,7,10,s);
}
public static void output(int a[], int n)
{
for (int i = 0; i < n; ++i){
if (a[i] != 0)
System.out.print(x[i] + " ");
}
System.out.println();
}
public static void subSet(int k, int n, int sum, int a[])
{
if (k == n)
{
if (sum == 0)
{
output(a, n);
}
return ;
}
for (int i =0; i <= 1; ++i)
{
x[k] = i;
sum -= a[k] * x[k];
subSet(k+1, n, sum, a);
}
}
}