【题解】[USACO12MAR]Cows in a Skyscraper G
题目大意:给定一个集合\(S\),给一个限制条件\(P\),要求划分集合,使得每一个子集\(A\in S\),\(A\)满足限制条件\(P\),且划分总数最小。
注意到数据范围\(n<=18\).
第一感状压。
搜索不想写,于是\(dp\).
原本设计的状态是\(f[i][j]\)表示当前状态为\(i\),枚举到第\(j\)件物品的最大容量,\(g[i][j]\)表示状态为\(i\),枚举到\(j\)的最小划分数。然而太复杂了,没有必要,写崩了搞了\(16pts\).
换一种思路。设计\(f[i]\)表示状态为\(i\)的最大容量,\(g[i]\)表示状态为\(i\)的最小划分。显然,以\(f\)为第一关键字转移,若可以装,则优先转移该状态。遵循贪心策略,当前背包只要可以装,那就装。
注意的是,需要更新背包数量的时候,注意要回归到\(w-a[j]\)
代码:
#include<bits/stdc++.h>
using namespace std;
//设计g[i]表示状态为i的背包最大容量
//f[i]表示状态为i的最小划分数
//
int n,w,ans=500;
int a[18];
int f[1<<18],g[1<<18];
int main(){
scanf("%d%d",&n,&w);
for(int i=0;i<n;++i)scanf("%d",&a[i]);
sort(a,a+n);
memset(f,0x3f,sizeof(f));
g[0]=w;f[0]=1;
for(int i=0;i<(1<<n);++i){
for(int j=0;j<n;++j){
if(i&(1<<j))continue;
if(g[i]>=a[j]){
if(f[i]<=f[i|(1<<j)]){
f[i|(1<<j)]=f[i];
g[i|(1<<j)]=max(g[i|(1<<j)],g[i]-a[j]);
}
}
else{
if(f[i]+1<=f[i|(1<<j)]){
f[i|(1<<j)]=f[i]+1;
g[i|(1<<j)]=max(g[i|(1<<j)],w-a[j]);
}
}
}
}
int T=(1<<n)-1;
cout<<f[T]<<endl;
return 0;
}
实现上可能有些许差异。注意两个数组代表的意义。
【题解】[USACO12MAR]Cows in a Skyscraper G的更多相关文章
- [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 ...
- 动态规划(状态压缩):BZOJ 2621 [Usaco2012 Mar]Cows in a Skyscraper
2621: [Usaco2012 Mar]Cows in a Skyscraper Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 303 Sol ...
- 洛谷 P3052 [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 状压dp
这个状压dp其实很明显,n < 18写在前面了当然是状压.状态其实也很好想,但是有点问题,就是如何判断空间是否够大. 再单开一个g数组,存剩余空间就行了. 题干: 题目描述 A little 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 ...
- [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 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper
迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A ...
- P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a spa ...
随机推荐
- Android反解符号表工具
cd ~/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin ./arm-linux-an ...
- 尝试MatCap类型shader
听说MatCap能在低端机上做出很漂亮的pbr效果,就尝试了一下. MatCap全称MaterailCapture,里面存的是光照信息,通过法线的xy分量去采样matcap,得到在该方向法线的光照信息 ...
- jumpserver如何在远程时使用复制粘贴-windwos系统下
jumpserver堡垒机搭建好了,但是在使用的时候,有时候会出现远程下不能复制粘贴,这让体验十分不爽. 于是着手解决这个问题,附上参考链接,感谢大佬:http://itren.xiaolee.net ...
- 一个后端开发的 Vue 笔记【入门级】
一 前言 最近找了些教程,顺带着趴在官网上,看了看 Vue 的一些内容,入门的一些概念,以及基础语法,还有一些常用的操作,瞄了一眼,通篇文字+贴了部分代码 9000 多字,入门语法什么的还是很好理解的 ...
- Zabbix value cache working in low memory mode
Zabbix监控自身时告警"Zabbix value cache working in low memory mode",出现这个问题是因为Zabbix Server的参数Valu ...
- 使用HttpUrlConnection访问www.163.com遇到503问题,用设置代理加以解决
一次我使用如下程序连接到网易,意图获取其网站的html文本: try { String urlPath = "http://www.163.com/"; URL url = new ...
- JS基础回顾_函数
函数 不要使用C风格的大括号 // log function return1() { return { name: 'oceans', } } function return2() { return ...
- adb安装apk包提示protocol failure问题
截图来自CSDN,待验证
- oracle之三资源管理
Oracle 资源管理 12.1 为什么要使用Oracle资源管理器 传统意义上,系统的资源分配是由OS来完成的,但是对于数据库资源,OS分配资源会带来一些问题: 以Linux为例,最为突出的一个问题 ...
- unserialize3 攻防世界
序列化是将对象转换为便于保存的字符串, 而反序列化是将便于保存的字符串转换为字符串. _wakeup()魔法方法 如果直接传参给code会被__wakeup()函数再次序列化,所以要绕过他, 利用__ ...