HDU 1712 ACboy needs your help(分組背包)
http://acm.hdu.edu.cn/showproblem.php?pid=1712
題意:
小杰有m天的時間去上n門不同的課. 對第i門課來講, 如果小杰花j天的時間在該課上, 那末小杰可以取得val[i][j]的價值. 現在給出矩陣val[n][m], 要你求出小杰能取得的最大價值和?
分析:
咋1看, n門課, m天的時間, 要我們求最大價值. 那末明顯是從n門課當選出適合的幾門, 是的總花費的時間<=m的條件下, 價值最大化. 但是發現每門課有m種不同的價值獲得方式.
所以我們換1種問題描寫方式: 有n組物品, 每組物品有m個且每組物品中最多只能選1個物品. 第i組物品的花費分別為1 2 3 …m, 第i組物品的價值分別為val[i][1], val[i][2]…val[i][m]. 現在問你初始金錢為m時, 通過上面n組物品, 最多能取得多少價值的物品?
上面問題就是1個明顯的分組背包問題了. 我們令dp[i][j]==x表示只選前i組物品且總花費<=j時, 能取得的最大價值為x.
初始化: dp全為0.
狀態轉移: dp[i][j] == max( dp[i⑴][j] , dp[i⑴][j-cost[k]]+val[k])
其中cost[k]和val[k]指的是第i組物品的第k個物品的花費和價值.
上面公式前者表示第i組物品1個都不選, 后者表示第i組物品選1個.
終究所求: dp[n][m]的值.
注意: dp遞推的3層循環的相互順序不能改變, 否者會錯.(可以自己想想為何是這樣的循環順序).程序用的轉動數組, dp只有1維.
AC代碼:
下一篇 Webx框架:依賴注入