请您先登录,才能继续操作
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-07
最后修改:2010-06-07
21. 工作分配问题。 input:第一行有1个正整数n(1<=n<=20)。接下来的n行每行n个数,表示工作费用。 例如: 22. 最佳调度问题。 输入:第一行有两个正整数n和k。 例如: 23. 无优先级运算问题。 例如: 24. 算24点问题。 例如: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-11
21.工作分配问题。
package abstractandlogic; /** * 21.工作分配问题。 设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij。试设计一个算法,为每一个人都分配一件不同的工作, 并使总费用达到最小。 * * input:第一行有1个正整数n(1<=n<=20)。接下来的n行每行n个数,表示工作费用。 output: 输出最小的总费用。 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.06.08 * */ public class BestWorkAttemper { /** * @param args */ public static void main(String[] args) { int n = 3; int[][] c = { { 0, 0, 0, 0 }, { 0, 10, 2, 3 }, { 0, 2, 3, 4 }, { 0, 3, 4, 5 } }; // 一个测试案例 BestWorkAttemper bwt = new BestWorkAttemper(n, c); bwt.tryi(1); int[] bx = bwt.getBestx(); int bf = bwt.getBestf(); // 输出 for (int i = 1; i <= n; i++) { System.out.print(bx[i] + " "); } System.out.println("\n" + bf); } private int n; // n个工作 private int[][] c; // 设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij private int[] x; // n个工作的排列解空间 private int[] bestx; // 最优解空间 private int bestf; // 最优解 /** * 构造方法 * * @param _n * @param _c */ public BestWorkAttemper(int _n, int[][] _c) { n = _n; c = _c; x = new int[n + 1]; bestx = new int[n + 1]; bestf = 36237; for (int i = 1; i <= n; i++) { x[i] = i; } } /** * 回溯搜索 * * @param i */ public void tryi(int i) { if (i > n) { compute(); } else { for (int j = i; j <= n; j++) { swap(x, i, j); tryi(i + 1); swap(x, i, j); } } } /** * 交换 * * @param x * @param i * @param j */ private void swap(int[] x, int i, int j) { int temp = x[i]; x[i] = x[j]; x[j] = temp; } /** * 计算最优 */ private void compute() { int sum = 0; for (int i = 1; i <= n; i++) { sum += c[i][x[i]]; } if (sum < bestf) { bestf = sum; for (int i = 1; i <= n; i++) { bestx[i] = x[i]; } } } /** * 获得最优工作次序 * * @return */ public int[] getBestx() { return bestx; } /** * 获得最小费用 * * @return */ public int getBestf() { return bestf; } } |
|
返回顶楼 | |