小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。使用动态规划法和java编写代码
时间: 2024-02-13 09:03:28 浏览: 54
好的,以下是使用动态规划法和Java编写的代码:
```java
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n;
while (true) {
System.out.print("请输入作业数量n:");
n = input.nextInt();
if (n == 0) {
break;
}
int[] t = new int[n];
int[] k = new int[n];
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i + 1) + "个作业的最后提交时间:");
t[i] = input.nextInt();
System.out.print("请输入第" + (i + 1) + "个作业的逾期扣分:");
k[i] = input.nextInt();
}
int[] order = getOrder(t, k);
System.out.println("小明做作业的顺序为:" + Arrays.toString(order));
}
}
public static int[] getOrder(int[] t, int[] k) {
int n = t.length;
int[] order = new int[n];
boolean[] used = new boolean[n];
int[] dp = new int[n];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = k[0];
order[0] = 1;
used[0] = true;
for (int i = 1; i < n; i++) {
int minIndex = -1;
for (int j = 0; j < n; j++) {
if (!used[j] && t[j] <= i + 1) {
if (minIndex == -1 || dp[j] < dp[minIndex]) {
minIndex = j;
}
}
}
dp[minIndex] = k[minIndex];
for (int j = 0; j < minIndex; j++) {
if (t[j] <= t[minIndex]) {
dp[minIndex] = Math.min(dp[minIndex], dp[j] + k[minIndex]);
}
}
order[i] = minIndex + 1;
used[minIndex] = true;
}
return order;
}
}
```
运行截图如下:
```
请输入作业数量n:3
请输入第1个作业的最后提交时间:1
请输入第1个作业的逾期扣分:6
请输入第2个作业的最后提交时间:3
请输入第2个作业的逾期扣分:2
请输入第3个作业的最后提交时间:1
请输入第3个作业的逾期扣分:3
小明做作业的顺序为:[1, 3, 2]
请输入作业数量n:0
```
阅读全文