题目链接
dfs和回溯题目。
通过这个题还学学会了数组的整体赋值。
int[] a={1,2,3};
int[] b=new int[3];
b=a;
a[0]=a[1]=a[2]=0;
本来我是这样赋值的,直接用=把一个数组赋值给另一个数组,可是结果总是不对,查阅后才知道,这只是赋给b了a地址,a改变b也会改变,不能实现对当前数据的拷贝。
最方便的是用
b=(int[])a.clone();
这样就达到目的了。(强转不能省)
import java.util.*;
import java.math.*;
public class Main {
public static int[][] is;
public static int r,res=0,max=0;
public static int[] nums,route,ans;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
r=sc.nextInt();
nums=new int[r];
route=new int[r];
ans=new int[r];
is=new int[r][r];
for(int i=0;i<r;i++)
nums[i]=sc.nextInt();
for(int i=0;i<r-1;i++){
for(int j=i+1;j<r;j++){
is[i][j]=sc.nextInt();
}
}
int[] rou=new int[r];
for(int i=0;i<r;i++){
Arrays.fill(route,-1);
res=nums[i];
rou[i]=1;
route[0]=i;
dfs(i,rou,1);
Arrays.fill(rou,0);
}
for(int i=0;i<r;i++)
if(ans[i]!=-1)
System.out.print(ans[i]+1+" ");
System.out.println();
System.out.println(max);
}
public static void dfs(int cur,int[] rou,int k){ //k是第几层
int i,j=0;
for(i=0;i<r;i++){
if(is[cur][i]!=0&&rou[i]==0){
rou[i]=1;
res+=nums[i];
route[k]=i;
dfs(i,rou,k+1);
res-=nums[i];
rou[i]=0;
}
else
j++;
}
if(j==r){
if(res>max){
ans=(int[])route.clone();
max=res;
}
return;
}
}
}