DFS(深度优先搜索)
/*
DFS(深度优先搜索),“深度”是关键,以走迷宫为例,不撞南墙不回头,先找到最深的,然后回溯到上一个路口,以此类推。
有上述可知,DFS可由递归实现,所谓的南墙就是递归边界。
*/
//package app;
import java.util.Scanner;
class DFSTest{
final static int maxn = 30;
static int maxValue = 0;
static int ans = 0;
static int[] w = new int[maxn]; //用于存放每个点的质量
static int[] c = new int[maxn]; //用于存放对应点的价值或者说权重
static int n,V; //n是有几点个点,V是能接受点的质量的最大总和
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
n = input.nextInt(); //输入有几个点
V = input.nextInt(); //输入能存放最大点的质量的总和
for(int i=0;i<n;i++){ //输入每个点的质量
w[i] = input.nextInt();
}
for(int i=0;i<n;i++){
c[i] = input.nextInt();//输入每个点的权重
}
input.close();
dfs(0, 0, 0);
dfs1(0, 0, 0);
System.out.println(maxValue);
System.out.println(ans);
}
public static void dfs(int index, int sumW, int sumC){//index是每个点对应的序号,sumW是质量总和,sumC是权重总和或者说是价值总和
if(index == n){
if(sumW <= V && sumC > maxValue){
maxValue = sumC;
}
return;
}
dfs(index+1, sumW, sumC);
dfs(index+1, sumW+w[index], sumC+c[index]);
}
public static void dfs1(int index, int sumW, int sumC){//剪枝后的DFS
if(index == n){
return;
}
dfs1(index+1, sumW, sumC);
if(sumW + w[index]<=V){
if(sumC + c[index] > ans){
ans = sumC + c[index];
}
dfs1(index+1, sumW+w[index], sumC+c[index]);
}
}
}