深度优先搜索(DFS, Depth-First Search) 是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解。例如求解数独,首先在某个格子内填人适当的数字,然后再继续在下一个格子内填人数字,如此继续下去。如果发现某个格子无解了,就放弃前一个格子上选择的数字,改用其他可行的数字。根据深度优先搜索的特点,采用递归函数实现比较简单。
题目:给定整数a1、a2、······、an,判断是否可以从中选出若干数,使它们的和恰好为k。
思路:从最开始的状态出发,遍历所有可以到达的状态。
public class 部分和问题{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int array[] = new int[n]; //接收传入的数组
int visit[] = new int[n]; //记录array数组中被选用的数的位置,0表示没有选中,1表示选中
for (int i = 0; i < array.length; i++) {
array[i] = in.nextInt();
}
int k = in.nextInt();
int index = 1; //指针,记录深度
int sum = 0;
if (Solution(array,index,sum,k,visit)) { //调用判断函数,如果数组中存在几个数加和等于k,返回true
System.out.print("YES ");
System.out.print("(" + k + " = ");
int ind = 0;
for (int i = 0; i < visit.length; i++) {
if (visit[i] == 1) {
if (ind == 0) {
System.out.print(array[i]);
} else {
System.out.print(" +" + " " + array[i]);
}
ind++;
}
}
System.out.print(")");
System.out.println();
} else {
System.out.println("NO");
}
}
public static boolean Solution(int[] array,int index,int sum,int k,int[] visit) {
//如果和大于k,不再搜索
if (sum > k) {
return false;
}
//如果指针到达数组最后,判断和是否等于k
if (index == array.length) {
return sum == k;
}
//选中当前数,visit[index] = 1
if (Solution(array,index+1,sum+array[index],k,visit)) {
visit[index] = 1;
return true;
}
//不选当前数,visit[index]=0
if (Solution(array,index+1,sum,k,visit)) {
visit[index] = 0;
return true;
}
return false;
}
}