【[USACO12MAR]Cows in a Skyscraper G】【状压DP && DFS】

本文解析了USACO 12MAR竞赛中的CowsinaSkyscraper G题目,探讨了如何使用最少电梯次数将奶牛送至底层,同时考虑电梯承载能力和奶牛重量。通过状态压缩和深度优先搜索方法,展示了如何通过动态规划求解物品分组问题,使得每组体积不超过最大承重。

[USACO12MAR]Cows in a Skyscraper G

题目描述

关于 Bessie 和朋友的一个鲜为人知的事实是,他们喜欢爬楼梯比赛。 一个更广为人知的事实是奶牛真的不喜欢下楼梯。 所以在奶牛们跑到他们最喜欢的摩天大楼的顶部之后,他们遇到了一个问题。 拒绝使用楼梯爬下来,奶牛被迫使用电梯回到底层。

电梯的最大承重能力为 W (1 <= W <= 100,000,000) 磅,奶牛 i 的重量为 C_i (1 <= C_i <= W) 磅。 请帮助 Bessie 弄清楚如何使用最少的电梯次数将所有 N (1 <= N <= 18) 头奶牛送到一楼。 每次乘坐电梯时奶牛的重量总和不得大于 W。

给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组。(n<=18)

输入格式

* 第 1 行:N 和 W 用空格分隔。

* 第 2…1+N 行:第 i+1 行包含整数 C_i,给出其中一头奶牛的重量。

输出格式

* 一个整数 R,表示所需的最少乘梯次数。

样例 #1

样例输入 #1

4 10 
5 
6 
3 
7

样例输出 #1

3

提示

有四头奶牛,体重分别为 5、6、3 和 7 磅。 电梯的最大承重能力为 10 磅。

我们可以将重 3 的母牛与其他任何母牛放在同一个电梯上,但其他三头母牛太重而无法组合。 对于上述解决方案,乘坐电梯 1 涉及奶牛 #1 和 #3,乘坐电梯 2 涉及奶牛 #2,乘坐电梯 3 涉及奶牛 #4。 对于这个输入,其他几种解决方案也是可能的。

解题思路

给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组。(n<=18)

dp[i][j]表示已经开了i架电梯,j是二进制数

dp[i][j]的值表示当前电梯里的重量。

dp[i][j]初始化

只有一头牛的电梯的重量就是 dp[1][k] = w[i]

其中 k 为二进制只有一位为1的十进制数。

例如:

000001   表示 1 第一只牛
000010   表示 2 第二只牛
000100   表示 4 第三只牛
001000   表示 8 第四只牛
memset(dp, inf, sizeof(dp));
for (int i = 0; i < n; i++)
    dp[1][1 << i] = w[i];

代码解析

状态压缩解法:

//给出n个物品,体积为w[i],现把其分成若干组
//要求每组总体积<=W,问最小分组。(n<=18)
int dp[20][1 << 18];
//dp[i][j]表示已经开了i架电梯,j是二进制数
//dp[i][j]的值表示当前电梯里的重量。
int n, m, w[20];
void solve(){
   
   
    cin >> n >> m;
    for (int i = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值