1. 程式人生 > >回溯演算法實踐--工作分配問題

回溯演算法實踐--工作分配問題

問題描述

設有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; } } } } }

總結

模版套路加剪枝(限界加約束)=清晰思路,這道題對回溯演算法的理解有很好的幫助,需加強跟隊友的交流。