回溯演算法實踐--工作分配問題
阿新 • • 發佈:2018-12-21
問題描述
設有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; } } } } }
總結
模版套路加剪枝(限界加約束)=清晰思路,這道題對回溯演算法的理解有很好的幫助,需加強跟隊友的交流。