这题是01背包(\(DP\))

如何判断要拆走那个积木,首先定义一个\(ans\)数组,来存放这对积木能拼成多高的,然后如果\(ans_i = n\)那么就说明这个高度的积木可以。

话不多说,上代码!

#include<cstdio> //从最小高度~1枚举, 如果能恰好达到这个高度(即用它有的积木恰好能拼出)有n个城堡
#include<cstring>
#include<algorithm>
using namespace std; int n, len, min_high = 2e9;
//n表示城堡数,len表示每块立方体积木的棱长, min_high表示所有城堡初始高度最小值
int w[10005],ans[10005]; //设ans[i]表示i能被多少组w[1..n]凑成,当dp[i]==true时,ans[i]++
//w[i]表示组成这座城堡的第i块积木的棱长
bool dp[10005]; //dp[i]表示能否使用当前的w[1..n]相加得到i
/* 有n件物品(积木),每件物品体积(积木的棱长)为w[i], 价值(积木的棱长)为w[i]。
有容量(城堡高度)为 V 的背包(城堡)。求在容量(城堡高度)允许的范围下,背包装入物品的价值和(积木的棱长和)有哪些可能值。*/ int main()
{
scanf("%d", &n);
for(int k = 1; k <= n; k++)
{
memset(dp, 0, sizeof(dp));
int cnt = 1, high = 0; //cnt表示每座城堡含积木的块数,high表示每座城堡的初始高度
while(1)
{
scanf("%d", &w[cnt]); //len表示组成这座城堡的每块积木的棱长
if(w[cnt] == -1) break;
high += w[cnt];
cnt++;
}
dp[0] = 1; // dp[0] = 1表示能使用当前的w[1..n]相加得到高度0
min_high = min(min_high, high); //求出所有城堡初始高度最小值
for(int i = 1; i < cnt; i++) //对每座城堡从1~g去枚举每一块积木
for(int j = high; j >= w[i]; j--)
dp[j] = dp[j] || dp[j-w[i]]; //01背包变形,即动态转移方程
for(int i = high; i >= 1; i--)
if(dp[i] == true) ans[i]++; //统计高度i出现次数
}
for(int i = min_high; i >= 1; i--) //从最小高度~1枚举
if(ans[i] == n) //如果能恰好达到这个高度(即用它有的积木恰好能拼出)有n个城堡
{
printf("%d\n", i);
return 0;
}
printf("0\n"); return 0;
}

\(Bye Bye!\)

【题解】「P1504」积木城堡的更多相关文章

  1. 「CH6202」黑暗城堡

    「CH6202」黑暗城堡 传送门 这道题是要让我们求以点 \(1\) 为源点的最短路树的方案数. 我们先跑一遍最短路,然后考虑类似 \(\text{Prim}\) 的过程. 当我们把点 \(x\) 加 ...

  2. 「SNOI2019」积木

    传送门 Description 有一块\(n\)行\(m\)列的网格板, \(n,m\)都是奇数.网格上平铺着一些\(1*2\)的积木.积木可以旋转,不能重叠.网格板上只有一格的空位. 你可以做两种操 ...

  3. 题解 「HDU6403」卡片游戏

    link Description 桌面上摊开着一些卡牌,这是她平时很爱玩的一个游戏.如今卡牌还在,她却不在我身边.不知不觉,我翻开了卡牌,回忆起了当时一起玩卡牌的那段时间. 每张卡牌的正面与反面都各有 ...

  4. 题解 「SCOI2016」萌萌哒

    link Description 一个长度为 $ n $ 的大数,用 $ S_1S_2S_3 \ldots S_n $表示,其中 $ S_i $ 表示数的第 $ i $ 位,$ S_1 $ 是数的最高 ...

  5. 题解 「SDOI2017」硬币游戏

    题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...

  6. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  7. 题解 「BZOJ3636」教义问答手册

    题目传送门 Description 作为泉岭精神的缔造者.信奉者.捍卫者.传承者,Pear决定印制一些教义问答手册,以满足泉岭精神日益增多的信徒.Pear收集了一些有关的诗选.语录,其中部分内容摘录在 ...

  8. 题解「BZOJ4310」跳蚤

    题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...

  9. 题解 「BZOJ2137」submultiple

    题目传送门 题目大意 给出 \(M,k\) ,求出 \[\sum_{x|M}\sigma(x)^k \] 给出 \(P_i\),满足 \(n=\prod_{i=1}^{n}a_i^{P_i}\),其中 ...

随机推荐

  1. Go语言内存分配(详述 转)

    一.内存管理简介 1.1 虚拟内存 虚拟内存是当代操作系统必备的一项重要功能,对于进程而言虚拟内存屏蔽了底层了RAM和磁盘,并向进程提供了远超物理内存大小的内存空间.我们看一下虚拟内存的分层设计. 上 ...

  2. python + selenium 搭建环境步骤

    介绍在windows下,selenium python的安装以及配置.1.首先要下载必要的安装工具. 下载python,我安装的python3.0版本,根据你自己的需要安装 下载setuptools ...

  3. 这 12 款 IDEA 插件你用过几款?

    搞 Java开发用什么软件,当然是神器idea了,那么,idea的插件对于你来说就是必不可少的了,不仅可以提高自己的编码效率,还可以减轻工作时的枯燥烦闷.接下来就来说说,我平时敲代码用的什么插件吧. ...

  4. GreenDao增删改查

    3.GreenDao增删改查 (1)插入 常用API //这是最简单的插入语句,新增一行数据,返回值为行号 public long insert(T entity) //传递一个数组,新增多行数据 p ...

  5. webpack、node、npm关系

    webpack模块打包 webpack为了正常运行, 必须依赖node环境, node环境为了可以正常的执行很多代码,必须其中包含各种依赖的包 npm工具(node packages manager) ...

  6. beef+metasploit

    beef调用metasploit模块,直接xss吊打 先进入beef的文件夹 对config.yaml进行修改 将metasploit的false改为true 进入这个文件夹 修改配置文件 检查met ...

  7. Hadoop大数据平台之Kafka部署

    环境:CentOS 7.4 (1708  DVD) 工具:Xshell+Xftp 1. 使用xftp将kafka上传到/usr/local目录下,将kafka解压并重命名. 2. 编辑kafka/co ...

  8. SpringBoot整合MyBatis,HiKari、Druid连接池的使用

    SpringBoot整合MyBatis 1.创建项目时勾选mybatis.数据库驱动.   mysql驱动默认是8.x的版本,如果要使用5.x的版本,创建后到pom.xml中改. 也可以手动添加依赖 ...

  9. 怎么在苹果笔记本上用Folx重新下载已完成的任务

    大家在完成了任务下载后,有时会将下载的文件移动到其他文件夹中,或者是,当下载的文件已经使用完毕时,有些用户会将文件删除.以上的两种情况,都会导致Folx所属任务查看功能失效,也就是说,无法找到任务对应 ...

  10. Guitar Pro吉他指弹入门——特殊调弦

    本期文章中,我们将通过吉他打谱软件Guitar Pro 7来向大家讲解指弹曲目中所涉及的特殊调弦. 作为一个吉他手,在练琴的时候总会遇到各种各样的问题,比如说鼓手不肯跟你合作(因为打鼓往往不能露脸), ...