文章目录
[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

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

被折叠的 条评论
为什么被折叠?



