问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入格式:
输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
输出格式:
将计算出的最小总费用输出到屏幕。
输入样例:
3 10 2 3 2 3 4 3 4 5
输出样例:
9
代码
import java.util.Scanner; public class Main { public static int n,selec_sum,fin_sum=1000; public static int[][]a = new int[100][100]; public static boolean[] flag = new boolean[100]; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = scanner.nextInt(); } flag[i]=false; } backTrack(0); System.out.println(fin_sum); scanner.close(); } static void backTrack(int t){ if(selec_sum>fin_sum){ return; } if (t>=n) { if (selec_sum<fin_sum) { fin_sum = selec_sum; } }else { for (int i = 0; i < n; i++) { if(!flag[i]){ flag[i]=true; selec_sum+=a[t][i]; backTrack(t+1); selec_sum-=a[t][i]; flag[i]=false; } } } } }
总结
模版套路加剪枝(限界加约束)=清晰思路,这道题对回溯算法的理解有很好的帮助,需加强跟队友的交流。