UVA 10163 - Storage Keepers(dp)
本文出自 http://blog.csdn.net/shuangde800
题目链接: 点击打开链接
题意
有n个仓库,让m个人来看管。一个仓库只能由一个人来看管,一个人可以看管多个仓库。
每个人有一个能力值pi,如果他看管k个仓库,那么所看管的每个仓库的安全值为 pi/k(向下取整)
如果某个仓库没有人看管,那么它的安全值为0。所有仓库的安全值L = min{ 每个仓库的安全值 }
如果雇佣一个人的工资等于他的能力值pi。
从m个人中选择一些人雇佣,问所有仓库的安全值最高是多少,在安全值最高的情况下,求雇佣的最少价钱。
思路
f[i][j]表示前i个人,管理j个仓库的最大安全值。
f[i][j] = max{ min{f[i-1][j-k], p[i]/k}, 0<=k<=j && k是第i个人管理的仓库个数 }
然后求最少价钱,
g[i][j]表示前i个人,管理j个仓库的最大安全值下所用的最少价钱
g[i][j] = min{ g[i-1][j-k]+p[i], p[i]/k>=f[m][n] && 0<=k<=j }
代码