1. 程式人生 > 其它 >【題解】HDU6968 - I love exam(揹包)

【題解】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)\)

程式碼戳這裡