写作业问题 小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。利用Java语言回溯法解决这个问题
时间: 2024-02-18 12:05:12 浏览: 59
好的,这里是Java语言的回溯法实现:
```java
public class HomeworkSchedule {
private int n;
private int[] t;
private int[] k;
private int minScore;
private int curScore;
public HomeworkSchedule(int n, int[] t, int[] k) {
this.n = n;
this.t = t;
this.k = k;
this.minScore = Integer.MAX_VALUE;
this.curScore = 0;
}
public int schedule() {
backtrack(new ArrayList<>());
return minScore;
}
private void backtrack(List<Integer> curHomeworks) {
if (curHomeworks.size() == n) { // 如果当前已经排好了所有作业,则更新最小扣分
minScore = Math.min(minScore, curScore);
return;
}
for (int i = 0; i < n; i++) { // 遍历所有未安排的作业
if (!curHomeworks.contains(i)) {
if (curHomeworks.size() >= t[i]) { // 如果当前时间已经超过该作业的最后提交时间,则计算逾期扣分
curScore += k[i];
}
curHomeworks.add(i); // 将该作业加入当前排好的作业中
backtrack(curHomeworks); // 递归处理下一步决策
curHomeworks.remove(curHomeworks.size() - 1); // 回溯,撤销该作业的选择
if (curHomeworks.size() >= t[i]) { // 如果当前时间已经超过该作业的最后提交时间,则撤销逾期扣分
curScore -= k[i];
}
}
}
}
}
```
使用样例:
```java
public class Main {
public static void main(String[] args) {
int n = 3;
int[] t = {1, 3, 1};
int[] k = {6, 2, 3};
HomeworkSchedule schedule = new HomeworkSchedule(n, t, k);
int minScore = schedule.schedule();
System.out.println(minScore); // 输出结果为 5
}
}
```
输出结果为5,和Python实现的结果一致。
阅读全文