UVa 10163 Storage Keepers(两次DP)
2012-11-27 01:05
381 查看
题意:
有n个仓库(最多100个),m个管理员(最多30个),每个管理员有一个能力值P(接下来的一行有m个数,表示每个管理员的能力值)
每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),
每个月公司都要给看管员工资,雇用的管理员的工资即为他们的能力值p和,问,使每个仓库的安全值最高的前提下,使的工资总和最小。
输出最大安全值,并且输出最少的花费。
思路:
题目有个限制是:所有物品里面最小的那个安全值即是总的安全值。
第一个dp[i, j] : 前i个人照看前j个物品的最大安全值。
第二个dp[i, j] : 在得到最大安全值的前提下前i个人照看前j个物品的最少花费。
有n个仓库(最多100个),m个管理员(最多30个),每个管理员有一个能力值P(接下来的一行有m个数,表示每个管理员的能力值)
每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),
每个月公司都要给看管员工资,雇用的管理员的工资即为他们的能力值p和,问,使每个仓库的安全值最高的前提下,使的工资总和最小。
输出最大安全值,并且输出最少的花费。
思路:
题目有个限制是:所有物品里面最小的那个安全值即是总的安全值。
第一个dp[i, j] : 前i个人照看前j个物品的最大安全值。
第二个dp[i, j] : 在得到最大安全值的前提下前i个人照看前j个物品的最少花费。
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 110; const int MAXM = 40; const int INF = 0x3f3f3f3f; int n, m, dp[MAXM][MAXN], p[MAXM]; int L, Y; bool solve() { for (int i = 0; i <= m; ++i) dp[i][0] = INF; for (int i = 1; i <= n; ++i) dp[0][i] = 0; for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) { dp[i][j] = dp[i-1][j]; for (int k = 0; k < j; ++k) dp[i][j] = max(dp[i][j], min(dp[i-1][k], p[i]/(j-k))); } if (dp[m] ) L = dp[m] ; else return false; for (int i = 0; i <= m; ++i) dp[i][0] = 0; for (int i = 1; i <= n; ++i) dp[0][i] = INF; for (int i = 1; i <= m; ++i) for (int j = 1; j <= n; ++j) { dp[i][j] = dp[i-1][j]; for (int k = 0; k < j; ++k) if (p[i]/(j-k) >= L) dp[i][j] = min(dp[i][j], dp[i-1][k] + p[i]); } Y = dp[m] ; return true; } int main() { while (scanf("%d %d", &n, &m) && n && m) { for (int i = 1; i <= m; ++i) scanf("%d", &p[i]); if (solve()) printf("%d %d\n", L, Y); else printf("0 0\n"); } return 0; }
相关文章推荐
- UVA 10163 Storage Keepers 两次dp
- DP(两次) UVA 10163 Storage Keepers
- HDU 5445 Food Problem、UVa 10163 Storage Keepers、POJ 3260 The Fewest Coins(两次dp)
- UVA - 10163 - Storage Keepers(两次dp)
- UVA 10163 Storage Keepers(两次DP)
- UVA 10163 Storage Keepers(两次DP)
- UVA 10163-Storage Keepers(DP)
- uva 10163 Storage Keepers (dp)
- UVA 10163 - Storage Keepers(dp)
- UVA-10163 Storage Keepers (DP多次)
- uva_10163 - Storage Keepers ( 普通DP )
- Storage Keepers - UVa 10163 dp
- 100道动态规划——13 UVA 10163 Storage Keepers 有约束条件下的DP,递推,不能使用结构体作为基本单位
- uva10163(两次dp)
- uva 10163 Storage Keepers (DP)
- UVA 10163 - Storage Keepers(dp)
- UVA 10163 - Storage Keepers(dp)
- uva 10163 两次Dp
- uva10163(DP)
- uva 10163——Storage Keepers