题目描述:

某游戏中,不同的兵种处在不同的地形上其攻击能力不一样,现有n个不同兵种的角色{1,2,...,n},需安排在某战区n个点上,角色i在j点上的攻击力为Aij。试设计一个布阵方案,使总的攻击力最大。

数据:

防卫点

角色

 

1

2

3

4

5

1

60

40

80

50

60

2

90

60

80

70

20

3

30

50

40

50

80

4

90

40

30

70

90

5

60

80

90

60

50

 

Java实现:


import java.util.Scanner;

public class Game {
	static int point;
	static int[] x; // 当前位置安排
	static int n; // 角色
	static int[] bestx; // 当前最大攻击力
	static int f; // 当前攻击力
	static int bestf; // 当前最优值
	static int[][] M; // 初始位置数组
	// 交换位置
	//

	public static void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;

	}

	// 回溯函数
	public static void backtrack(int i) {
		if (i > n) {
			int t = 0;
			for (int j = 1; j <= n; j++)
				t += M[x[j]][j];
			if (t > bestf) {
				bestf = t;
				for (int j = 1; j <= n; j++)
					bestx[j] = x[j];
			}
		} else {
			for (int j = i; j <= n; j++) {

				
				int temp = x[i];
				x[i] = x[j];
				x[j] = temp;

				backtrack(i + 1);
				
				temp = x[i];
				x[i] = x[j];
				x[j] = temp;

			}
		}
	}
	
	public static void main(String[] args) {

		// 输入n个兵种
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		point = in.nextInt();
		M = new int[point + 1][n + 1];

		x = new int[n + 1];
		bestx = new int[n + 1];
		f = 0;

		// 读入数据矩阵
		for (int i = 1; i <= point; i++) {
			for (int j = 1; j <= n; j++) {

				M[i][j] = in.nextInt();
				// System.out.println(M[i][j] + " ");
			}
		}

		for (int i = 1; i <= n; i++) {
			x[i] = i;
		}

		bestf = 0;
		//回溯找到最优值
		backtrack(1);
		System.out.println(bestf);
		for (int i = 1; i <= n; i++) {
			System.out.println( bestx[i] + " ");
		}
		System.out.println();

	}
}