1 条题解

  • 0
    @ 2025-7-2 9:34:23

    假设有两对夫妇,如果夫妇同住一屋,需要两个 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
    上传者