通过python用动态规划法完成写作业问题 小明上学,老师布置了 n 个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间ti及其逾期的扣分ki。已知作业n = 3,每个作业的最后提交时间t = [1,3,1],作业逾期扣分k = [6,2,3]。以输入n = 0时作为结束,请给出小明做作业的顺序,以便扣最少的分数。
时间: 2024-02-22 15:54:45 浏览: 57
好的,这是一个典型的背包问题,可以使用动态规划来解决。我们可以定义一个二维数组dp来表示前i个作业,在不迟交的情况下,最小的扣分数。
具体地,dp[i][j]表示前i个作业用了j天的最小扣分数。那么,对于第i个作业,有两种情况:
1. 在最后提交时间前完成,即j≤ti,则扣分为0,dp[i][j] = dp[i-1][j]。
2. 在最后提交时间后完成,即j>ti,则扣分为ki,我们需要在之前的时间内尽可能多地完成作业,以便腾出更多时间来完成后面的作业。因此,dp[i][j] = min(dp[i-1][k]+ki),其中k从1到ti。
最终的结果就是dp[3][3],即前三个作业用了三天的最小扣分数。下面是Python代码实现:
```python
n = 3
t = [1, 3, 1]
k = [6, 2, 3]
max_day = max(t) # 最后提交时间的最大值
dp = [[0] * (max_day+1) for _ in range(n+1)] # 初始化dp数组
for i in range(1, n+1):
for j in range(1, max_day+1):
if j <= t[i-1]:
dp[i][j] = dp[i-1][j] # 情况1
else:
dp[i][j] = min(dp[i-1][k]+k[i-1] for k in range(1, t[i-1]+1)) # 情况2
print(dp[n][max_day])
```
运行结果为2,即小明最少扣2分。他的做作业顺序是:先做第1个作业,再做第3个作业,最后做第2个作业。
阅读全文