题目是说一小偷偷东西,第i个物品的价值是M[i],被抓的概率是p[i],现在要使得在被抓的概率在P以下时的所能偷得的最大价值。
不同于以往的01背包,这里需要将价值作为物品的大小。同时如果偷A被抓的概率是Pa,偷B被抓的概率是Pb那么偷两个物品被抓的概率就是
1-(1-Pa)*(1-Pb)
这时令DP[i][j]代表对于前i个物品偷得的价值为j时的最小的被抓的概率,这时可以得到状态转移方程:
DP[i][j] = MIN( DP[i-1][j], 1-(1-DP[i-1][j-M[i]])*(1-p[i]) )
最后的结果就是对于所有的DP[N][i]<P的最大的j
同样可以将状态压缩到一维的空间,注意边界(最初时):
DP[i] = 1;一旦偷东西就会被抓
DP[0] = 0;什么都没偷一定不会被抓
1 #include