【题解】HDU6968 I love exam

中文:https://www.fzoi.top/problem/4970
英文:http://acm.hdu.edu.cn/showproblem.php?pid=6968

题意

\(n\)门课,每门课用只包含小写字母且长度不超过\(15\)的字符串表示,初始每一门的分数都是\(0\)

\(m\)种复习资料,对于每份复习资料,可以花费\(y_i\)天,使课程\(s_i\)提高\(x_i\)分,每份复习资料只能使用一次,保证复习资料指定的课程包含在\(n\)门课程里面。注意如果花费天数不到\(yi\),不会得到任何提升。

一门课的分数上限为\(100\),如果使用一份复习资料前的分数\(+x_i\ge 100\),则使用后的分数\(=100\)

如果一门课最终分数严格小于\(60\),则称为挂科。

\(T\)组询问,每次询问在一共剩下\(t\)天去复习,最多允许挂\(p\)门课的条件下,所有课程的总分最高为多少。如果不能使得挂科数小于等于\(p\),则输出\(-1\)​。

\(T\le 10,n\le 50,m\le 15000,1\le x_i,y_i\le 10,1\le t\le 500,0\le p\le 3\)


解法

可以发现每一科的复习是独立的,因此可以计算出\(g[i,j]\)表示第\(i\)门课,花费\(j\)天能够补到的最高分数。将时间看作体积,分数看作价值,用背包求解。

然后考虑科与科之间,由于时间有冲突,可以想到用dp来解决。

\(f[i,j,k]\)表示前\(i\)科,花费\(j\)天,挂了\(k\)科,总分最高是多少。

转移可以枚举第\(i\)科用了多少天来复习,设为\(l\),如果足以及格(\(g[i,j]\ge 60\)),则从\(f[i-1,j-l,k]\)转移来。否则从\(f[i-1,j-1,k-1]\)转移来。

答案为\(max\{f[n,t,i] \}\ (0\le i\le p)\),注意特判\(-1\)

时间复杂度\(O(Tmt+Tnpt^2)\)

代码戳这里

posted @ 2021-10-15 22:06  hzy1  阅读(47)  评论(0编辑  收藏  举报