用java写一个任务数与人数相等的蛮力法解决任务分配问题
时间: 2023-12-30 08:03:32 浏览: 71
蛮力法解决最近对问题
4星 · 用户满意度95%
好的,如果任务数和人数相等,我们可以采用全排列的方式枚举所有任务分配方案,下面是用Java实现的代码:
```java
import java.util.*;
public class TaskAssignment {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入任务数量n:");
int n = sc.nextInt();
int[][] time = new int[n][n];
System.out.println("请按照任务顺序输入每个人完成任务所需时间:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
time[i][j] = sc.nextInt();
}
}
int[] assignment = new int[n];
for (int i = 0; i < n; i++) {
assignment[i] = i;
}
int[] bestAssignment = assignment.clone();
int bestTime = getTotalTime(time, assignment);
while (nextPermutation(assignment)) {
int totalTime = getTotalTime(time, assignment);
if (totalTime < bestTime) {
bestTime = totalTime;
bestAssignment = assignment.clone();
}
}
System.out.println("最短完成时间为:" + bestTime);
System.out.println("最优任务分配方案:");
for (int i = 0; i < n; i++) {
System.out.println("任务" + (i + 1) + "分配给人员" + (bestAssignment[i] + 1));
}
}
public static int getTotalTime(int[][] time, int[] assignment) {
int n = assignment.length;
int totalTime = 0;
for (int i = 0; i < n; i++) {
totalTime += time[i][assignment[i]];
}
return totalTime;
}
public static boolean nextPermutation(int[] a) {
int n = a.length;
int i = n - 2;
while (i >= 0 && a[i] >= a[i + 1]) {
i--;
}
if (i < 0) {
return false;
}
int j = n - 1;
while (a[j] <= a[i]) {
j--;
}
int temp = a[i];
a[i] = a[j];
a[j] = temp;
for (int k = i + 1, l = n - 1; k < l; k++, l--) {
temp = a[k];
a[k] = a[l];
a[l] = temp;
}
return true;
}
}
```
以上代码中,我们首先输入任务数量n,然后输入每个人完成任务所需时间,接着初始化任务分配方案,即将任务1分配给人员1,任务2分配给人员2,以此类推,之后依次枚举所有任务分配方案,计算总时间并更新最优方案。最后输出最短完成时间和最优任务分配方案。
阅读全文