uva_10163 - Storage Keepers ( 普通DP )
2012-12-19 15:57
274 查看
题意:某公司有n个仓库,公司需要招聘m个人,其中每个人有一个能力值,每个仓库只能由一个人看守,每个人可以看守多个仓库,其中总体的安全度定义为:min(person/cnt_storage), 问最大的安全度L是多少,该安全度下的最少花费是多少. 对于这个题,一开始想了3维的dp,很可惜超时了,其实可以先求所能达到的最高安全度,再根据安全度求这个最低花费 求最高安全度L状态: f[i][j] 表示前i个person看守前j个storage所能达到的最大安全度 状态转移: f[i][j] = max(f[i-1][j], f[i-1][k]) 其中( 1 <= k <= j) 然后就是初始化的处理了 求少花费同理, 如有不懂,看code #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXM 31 #define MAXN 101 #define INF 0x3f3f3f3f int dp[MAXM][MAXN], f[MAXN][MAXN], p[MAXN], max_bil; int dfs(int x, int y) { if( -1 != dp[x][y] ) { return dp[x][y]; } if( !y ) { return dp[x][y] = 0; } if( 1 == x ) { return dp[x][y] = ((max_bil <= p[x]/y)? p[x] : -1); } dp[x][y] = ((-1 == dfs(x-1, y))? INF : dfs(x-1, y)); for(int t = 1; t <= y; t ++) { if( p[x]/t < max_bil ) { continue; } dp[x][y] = min(dp[x][y], ((-1 == dfs(x-1, y-t))? INF : dfs(x-1, y-t))+p[x]); } return dp[x][y]; } int dfs_l(int x, int y) { if( -1 != f[x][y] ) { return f[x][y]; } if( !y ) { return f[x][y] = INF; } if( 1 == x ) { return f[x][y] = (int)(p[x]/y); } f[x][y] = dfs_l(x-1, y); for(int t = 1; t <= y; t ++) { f[x][y] = max(f[x][y], min(dfs_l(x-1, y-t), (p[x]/t))); } return f[x][y]; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); #endif int storage, person, max_l, cash; while( scanf("%d %d", &storage, &person) ) { if( !storage && !person ) { break; } max_l = max_bil = cash = 0; for(int i = 1; i <= person; i ++) { scanf("%d", &p[i]); max_bil = max(max_bil, p[i]); } memset(dp, -1, sizeof(dp)); memset(f, -1, sizeof(f)); max_bil = dfs_l(person, storage); if( !max_bil ) { printf("0 0\n"); continue; } printf("%d %d\n", max_bil, dfs(person, storage)); } return 0; }
相关文章推荐
- UVA 10163 Storage Keepers(两次DP)
- uva 10163 Storage Keepers (DP)
- DP(两次) UVA 10163 Storage Keepers
- 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)
- UVA-10163 Storage Keepers (DP多次)
- HDU 5445 Food Problem、UVa 10163 Storage Keepers、POJ 3260 The Fewest Coins(两次dp)
- Storage Keepers - UVa 10163 dp
- UVA - 10163 - Storage Keepers(两次dp)
- 100道动态规划——13 UVA 10163 Storage Keepers 有约束条件下的DP,递推,不能使用结构体作为基本单位
- uva10163(DP)
- uva 10163 Storage Keepers
- UVA-10163 Storage Keepers (0-1背包)
- uva_10271 - Chopsticks (普通DP)