最优子结构证明
https://blog.csdn.net/qq_39559641/article/details/101209534
写的不错
简简单单
import javax.swing.text.Style;
import java.util.Scanner;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] map = new int[N][N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
map[i][j] = sc.nextInt();
}
}
//初始化完毕
int min_cost = TSP(map,N);
System.out.println(min_cost);
}
public static int TSP(int[][] map, int N){
// 代表从 i点 到 初始点 经过集合V中的每一个点,并且只经过一次的最短路径
// v最多包含N-1个点 因此 V最多含有 2^(N-1)中状态 每个点使用二进制中的0或者1表示
int[][] dp = new int[N][(int) (Math.pow(2,N-1))];
//当前点为i
//如果 V 是空 dp=c【i,s】
//否则 V = min(遍历k属于V, c【i,k】 + dp[k][V-k]);
// V 不能包含 i节点本身
//假设从 0 开始环游
for(int j=0;j<dp[0].length;j++){
for (int i=0;i<dp.length;i++){
dp[i][j] = Integer.MAX_VALUE;
// 空状态 j=0 i不经过任何点 直接到0
if( j == 0 && i!=0) dp[i][j] = map[i][0];
// v 不为空
else{
// V中包含i节点本身 直接
if( (j & 1<<(i-1)) !=0 ) continue;
for(int k=1;k<N;k++){
// 如果k节点在V中
if( (j>>(k-1) & 1) ==1 ){
int newstate = j ^ (1<<(k-1)); // k节点抹去 异或操作
dp[i][j] = Math.min(dp[i][j],map[i][k] + dp[k][newstate] );
}
}
}
}
}
//循环结束 状态dp更新完成
return dp[0][dp[0].length-1];
}
}



京公网安备 11010502036488号