[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper (状态压缩DP)
不打算把题目放着,给个空间传送门,读者们自己去看,传送门(点我) 。
这题是自己做的第一道状态压缩的动态规划。
思路:
在这题中,我们设f[i]为i在二进制下表示的那些牛所用的最小电梯数。
设g[i]为i在二进制下表示的那些牛使用的电梯中剩下的最大容量。
所以很明显的,我们只要枚举每一只牛就可以了。
如果当前状态下,最大容量能装进某只牛,则装进去,并且用两个变量保存装进去后的f值与g值,否则再使用一个新的电梯,并且用变量保存用新电梯后的f与g值。
在每次的枚举,我们还要将当前保存的f值与g值与原来保存的状态值进行对比,取最小的,在这,如果当前枚举的f值与原来保存的f值相等,则我们更新g值,在两者间取最大的即可。
其中 i & (1 << j-1) 是判断第j只牛是否在状态i中,i | (1 << j-1) 表示将第j只牛装进去后的状态。
下面贴出代码,有问题下面留言
#include<cstdio>
#include<algorithm>
#define N 1<<20
using namespace std; int f[N],g[N],w[]; int main(){
int n,c;
scanf("%d%d",&n,&c);
for(int i = ; i <= n; i++)scanf("%d",&w[i]);
int mxx = ( << n)-; //mxx为最终状态
for(int i = ; i <= mxx; i++)f[i] = ,g[i] = c;
f[] = ;
for(int i = ; i < mxx; i++){
for(int j = ; j <= n; j++) //枚举每只牛
if(!(i&( << j-))){ //判断第j只牛是否在状态i中,不存在则进行计算
int nowf,nowg; //当前f,g值
if(g[i] >= w[j]){ //如果原始最大剩余空间大于w[j]则说明可以将第j只牛装进去
nowg = g[i]-w[j];
nowf = f[i];
}
else nowg = c-w[j],nowf = f[i]+; //否则新用一个电梯
if(nowf < f[i | ( << j-)]){ //取原值与现值中的最小值
f[i | ( << j-)] = nowf;
g[i | ( << j-)] = nowg;
}
else if(nowf == f[i | ( << j-)])g[i | ( << j-)] = max(nowg,g[i | ( << j-)]); //当nowf 与 f[i | (1 << j-1)]相等时,要更新g值最大,取更大那个
}
}
if(g[mxx] < c)f[mxx]++; //如果当前算得的最终状态剩下的容量小于c,则说明还需一个电梯
printf("%d\n",f[mxx]);
return ;
}
[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper (状态压缩DP)的更多相关文章
- P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 状压dp
这个状压dp其实很明显,n < 18写在前面了当然是状压.状态其实也很好想,但是有点问题,就是如何判断空间是否够大. 再单开一个g数组,存剩余空间就行了. 题干: 题目描述 A little k ...
- [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
洛谷题目链接:[USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...
- 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...
- P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a spa ...
- [USACO12MAR] 摩天大楼里的奶牛 Cows in a Skyscraper
题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...
- 洛谷 P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...
- LUOGU P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...
- [bzoj2621] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目链接 状压\(dp\) 根据套路,先设\(f[sta]\)为状态为\(sta\)时所用的最小分组数. 可以发现,这个状态不好转移,无法判断是否可以装下新的一个物品.于是再设一个状态\(g[sta] ...
- [luoguP3052] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper(DP)
传送门 输出被阉割了. 只输出最少分的组数即可. f 数组为结构体 f[S].cnt 表示集合 S 最少的分组数 f[S].v 表示集合 S 最少分组数下当前组所用的最少容量 f[S] = min(f ...
随机推荐
- 【ACM】hdu_2020_绝对值排序_201308050929
绝对值排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- SCVMM-VMWARE ACE虚拟机管理工具
SCVMM是微软的虚拟化管理工具 VMWARE ACE是另一套虚拟化的工具 这两套工具都是用来管理虚拟机的,可以直接将物理机虚拟化为虚拟机 企业一旦发展到了一定阶段,并然需要自己的服务器和虚拟化环境, ...
- codevs——T1169 传纸条
http://codevs.cn/problem/1169/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De ...
- caffe中ConvolutionLayer的前向和反向传播解析及源码阅读
一.前向传播 在caffe中,卷积层做卷积的过程被转化成了由卷积核的参数组成的权重矩阵weights(简记为W)和feature map中的元素组成的输入矩阵(简记为Cin)的矩阵乘积W * Cin. ...
- Javascript中数据实时推送
数据变化后前端需要更新,有几种方式:(参考http://www.xiaocai.name/post/cf1f9_7b6507) .利用setInterval函数,每隔n秒去异步拉取数据.对数据实时性要 ...
- SVNserver搭建和使用(二)
上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下怎样使用VisualSVN Server建立版本号库,以及TortoiseSVN的使用. 首先打开V ...
- POJ3190 Stall Reservations 贪心
这是个典型的线程服务区间模型.一些程序要在一段时间区间上使用一段线程运行,问至少要使用多少线程来为这些程序服务? 把所有程序以左端点为第一关键字,右端点为第二关键字从小到大排序.从左向右扫描.处理当前 ...
- linux下图片转换工具[【转】
本文转载自:https://linux.cn/article-8014-1.html 计算机术语中,批处理指的是用一个非交互式的程序来执行一序列的任务的方法.这篇教程里,我们会使用 Linux 命令行 ...
- poj--1664--放苹果(递归好体)
放苹果 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Submit Status De ...
- lua队列实现
Queue = {} function Queue.newquene() } end function Queue.push(queue, value) queue.count = queue.cou ...