我正在努力想出一个类似于以下问题的解决方案:
使用动态编程,解决问题,找到花费T单位时间学习的最佳方式,这将获得最高的总分。
提前感谢您的任何帮助:)
我的尝试:
S[][] = 0
for i = 1:n
for j = 0:T
max = 0
for k = 0:j
Grade = G[i][j]+ S[i-1][T-k]
if Grade > max
max = Grade
end for
S[i][j] = max
end for
end for
答案 0 :(得分:10)
让S[i][j]
代表您在第一次j
考试中花费i
个单位时间的最佳分数。您可以通过S[i][j]
查看S[i-1][k]
的每个值来计算k
。对于S
的每个元素,请记住上一行中k
的值,该值会产生最佳结果。及时研究所有考试的最佳分数T
的答案仅为S[n][T]
,您可以使用您记得的k
的值来确定每个考试花费的时间考试。
S[][] = 0
for j = 0:T
S[0][j] = M[0][j]
for i = 1:n
for j = 0:T
max = 0
for k = 0:j
# This is the score you could get by spending j time, spending
# k time on this exam and j-k time on the previous exams.
Grade = S[i-1][j-k] + M[i][k]
if Grade > max
max = Grade
end for
S[i][j] = max
end for
end for
答案 1 :(得分:2)
我认为你问题中的G和G你的意思是一样的,如果你没有花任何时间考试,你得到0分。
在这种情况下,我会将DP矩阵定义为D [i,t] =通过在0到i的考试子集上花费t个总时间单位来实现的最佳分数。
W.l.o.g。你可以假设矩阵的第一列是全0。
在这种情况下,您可以观察到D满足以下重复:
这是您应用动态编程所需的内容