【题解】[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 ...
 
随机推荐
- 攻防世界——web新手练习区解题总结<3>(9-12题)
			
第九题simple_php: 看题目说是php代码,那必定要用到php的知识,让我们先获取在线场景,得到如下网页 仔细看这个代码,意思大概是: 1.当a==0且a为真时输出flag1 2.当b为数字退 ...
 - Single Shot MultiBox Detector论文翻译【修改】
			
这几天读了SSD论文的原理部分,看了别人的翻译,发现很多应该都是google直接翻译过来的,有些地方读的不是很通顺,自己就在自己的理解和搜索的基础上对我看的那篇翻译做了一些修改.[原文地址:http: ...
 - windows环境下利用Gitblit搭建Git服务器并实现自动部署Web站点目录
			
Git服务搭建多见于linux环境,但windows主机也不少,目前网上文章诸多不全,且以讹传讹,不甚清楚.下面介绍windows环境下的自动部署和发布. 所需环境及资源:Java环境.Gitblit ...
 - 常见的开源 License
			
目录 什么是开源软件 什么是 license 商业许可证与开源许可证 对开发者的影响 开源许可证的类型 如何选择开源许可证 什么是开源软件 开放源代码的软件.假设有一天自我感觉代码能力不错,写了个小工 ...
 - path.resolve和path.join的区别
			
// test.js const path = require('path') let x1 = path.resolve('/目录1/目录2', '/目录3/目录4/') let x2 = path ...
 - xUnit测试的顺序执行总结
			
cmliu 1,演示环境:windows 10企业版+Visual Studio 2019:.NET Core3.1:xUnit 2.4.1:.NET Standard 2.0.3 3,场景描述:前几 ...
 - 本机ping不通虚拟机,但虚拟机可以ping通本机时怎么解决
			
在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案: 1.linux虚拟机中连接方式选择NAT模式 2.本地启动VMnet8,然后选择VMnet8的属性,手动输入和 ...
 - 大写的服,看完这篇你还不懂RocketMQ算我输
			
目录 RocketMQ介绍 RocketMQ概念 为什么要用RocketMQ? 异步解耦 削峰填谷 分布式事务最终一致性 数据分发 RocketMQ架构 RocketMQ消息类型 普通消息 顺序消息 ...
 - 在windows下使用pip安装python包遇到缺失stdint.h文件的错误
			
今天在windows上使用pip安装一个python包python-lzf时遇到如下的错误: fatal error C1083: Cannot open include file: 'stdint. ...
 - Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!
			
Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...