1 条题解
-
0
假设有两对夫妇,如果夫妇同住一屋,需要两个 2+2 的房间,如果把他们分成 2 男 2 女,也就是分成 2+2 的房间,且房间还可以住其他人,所以显然更优,因此最优的情况下最多只有 c%2 的夫妇住在一起,那么只要用动态规划计算 “没有夫妻住在一起” 的情况和 “只有一对夫妻住在一起” 的情况就行了。
用 f[i][a][b][c] 表示前 i 个房间, a 个男人,b 个女人,c 对夫妇 全部住下最少需要多少钱。则:
ans=min(f[rn][mn][fn][0], f[rn][mn-1][fn-1][1])
0-1 背包,dp(i) 只和 dp(i-1) 有关,可以优化空间,倒序枚举其他维(背包容量、费用等)
for(ri = 1; ri <= rn; ri++)//房间 { for(mi = mn; mi >= 0; mi --)//男 { for(fi = fn; fi >= 0; fi--)//女 { for(ci = 1; ci >= 0; ci --)//夫妇 { if(mi + fi + ci == 0) continue; if(mi >= 1) dp[mi][fi][ci] = minv(dp[mi][fi][ci], dp[mi - minv(mi, rooms[ri].cap)][fi][ci] + rooms[ri].price); if(fi >= 1) dp[mi][fi][ci] = minv(dp[mi][fi][ci], dp[mi][fi - minv(fi, rooms[ri].cap)][ci] + rooms[ri].price); if(ci >= 1 && rooms[ri].cap >= 2) dp[mi][fi][ci] = minv(dp[mi][fi][ci], dp[mi][fi][0] + rooms[ri].price); } } } if(dp[mn][fn][0] < minCost) minCost = dp[mn][fn][0]; if(dp[mn - 1][fn - 1][1] < minCost) minCost = dp[mn - 1][fn - 1][1]; }
- 1
信息
- ID
- 308
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 50
- 已通过
- 7
- 上传者