[Usaco2005 Dec]Scales 天平
题目描述
约翰有一架用来称牛的体重的天平.与之配套的是N(1≤N≤1000)个已知质量的砝码(所有砝码质量的数值都在31位二进制内).每次称牛时,他都把某头奶牛安置在天平的某一边,然后往天平另一边加砝码,直到天平平衡,于是此时砝码的总质量就是牛的质量(约翰不能把砝码放到奶牛的那边,因为奶牛不喜欢称体重,每当约翰把砝码放到她的蹄子底下,她就会尝试把砝码踢到约翰脸上).天平能承受的物体的质量不是无限的,当天平某一边物体的质量大于C(1≤C<2^30)时,天平就会被损坏. 砝码按照它们质量的大小被排成一行.并且,这一行中从第3个砝码开始,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和. 约翰想知道,用他所拥有的这些砝码以及这架天平,能称出的质量最大是多少.由于天平的最大承重能力为C.他不能把所有砝码都放到天平上.
现在约翰告诉你每个砝码的质量,以及天平能承受的最大质量.你的任务是选出一些砝码,使它们的质量和在不压坏天平的前提下是所有组合中最大的.
输入格式
第1行:两个用空格隔开的正整数N和C.
第2到N+1行:每一行仅包含一个正整数,即某个砝码的质量.保证这些砝码的质量是一个不下降序列
输出格式
一个正整数,表示用所给的砝码能称出的不压坏天平的最大质量.
第一眼想用背包来做这题,然而数据太大了......
注意题中指明了砝码重量最慢的情况呈斐波那契式增长。通过输出斐波那契数列发现当n=45时Fib[n]就大于1e9了。所以这题的n实际上也就50的规模......
既然动规的数组存不下,又没(lan)想(de)到(xiang)其它算法,先打个爆搜下去。火字旁细节了
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1001
using namespace std;
int a[maxn];
int m,n;
long long ans,c[maxn];
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
void dfs(int d,long long now){
if(d>n){ ans=max(ans,now); return; }
if(now+a[d]<=m) dfs(d+1,now+a[d]);//选
dfs(d+1,now);//不选
}
int main(){
n=read(),m=read();
for(register int i=1;i<=n;i++) a[i]=read();
for(register int i=1;i<=n;i++) c[i]=c[i-1]+a[i];
dfs(1,0);
printf("%lld\n",ans);
return 0;
}
然后考虑剪枝。首先我们可以倒着枚举砝码,这样产生的搜索树就会小很多;
然后假设当前的答案为ans,最多的情况就是从当前位开始把后面的全部都选上。如果后面的砝码总重加上当前的重量都要小于等于ans的话那就没必要往下搜了。
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1001
using namespace std;
int a[maxn];
int m,n;
long long ans,c[maxn];
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
void dfs(int d,long long now){
if(d>n){ ans=max(ans,now); return; }
if(now+c[n]-c[d-1]<=ans) return;//最优性剪枝
if(now+a[d]<=m) dfs(d+1,now+a[d]);
dfs(d+1,now);
}
int main(){
n=read(),m=read();
for(register int i=n;i>=1;i--) a[i]=read();//倒着枚举
for(register int i=1;i<=n;i++) c[i]=c[i-1]+a[i];
dfs(1,0);
printf("%lld\n",ans);
return 0;
}
[Usaco2005 Dec]Scales 天平的更多相关文章
- bzoj1673[Usaco2005 Dec]Scales 天平*
bzoj1673[Usaco2005 Dec]Scales 天平 题意: n个砝码,每个砝码重量大于前两个砝码质量和,天平承重为c,求天平上最多可放多种的砝码.n≤1000,c≤2^30. 题解: 斐 ...
- bzoj:1673 [Usaco2005 Dec]Scales 天平
Description Farmer John has a balance for weighing the cows. He also has a set of N (1 <= N <= ...
- 【BZOJ】1673: [Usaco2005 Dec]Scales 天平(dfs背包)
http://www.lydsy.com/JudgeOnline/problem.php?id=1673 bzoj翻译过来的c<=230不忍吐槽......................... ...
- BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1673 题意: 有n个砝码(n <= 1000),重量为w[i]. 你要从中选择一些砝 ...
- bzoj 1673: [Usaco2005 Dec]Scales 天平【dfs】
真是神奇 根据斐波那契数列,这个a[i]<=c的最大的i<=45,所以直接搜索即可 #include<iostream> #include<cstdio> usin ...
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
[BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...
- 【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS
[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为 ...
- BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 414 Solved: ...
- BZOJ1671: [Usaco2005 Dec]Knights of Ni
1671: [Usaco2005 Dec]Knights of Ni Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 175 Solved: 107[Su ...
随机推荐
- HBase过滤器:SingleColumnValueFilter和FirstKeyOnlyFilter一起使用的问题
FirstKeyOnlyFilter是对第一列进行过滤,hbase中的列按照字典序排列,所以如果SingleColumnValueFilter中的过滤列不是第一列的话,FirstKeyOnlyFilt ...
- 你真的了解Python自动化吗?这篇文章可以让你了解90%
人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面: 软件质量:在很大程度上,Python更注重可读性.一致性和软件质量,从而与脚本语言世界中的其他工具区别开发.此外,Pyt ...
- angular 8 表单带文件上传接口
<div id="homework"> <form (ngSubmit)="doSubmit()" enctype="multipa ...
- Java8 - Stream流:让你的集合变得更简单!
前段时间,在公司熟悉新代码,发现好多都是新代码,全是 Java8语法,之前没有了解过,一直在专研技术的深度,却忘了最初的语法,所以,今天总结下Stream ,算是一份自己理解,不会很深入,就讲讲常用的 ...
- [.NET] - 基础知识 - 如何debug一个.NET application
1.可以使用Debug/Trace类来将runtime信息输出到控制台窗口: https://msdn.microsoft.com/en-us/library/bs4c1wda.aspx https: ...
- 怎么同步fork原git项目
如何实现 有时候,我们看到有价值的git项目,通常,我们会选择把原项目fork过来,然后自己去把玩研究.然而,原项目进行了更新,fork过来的代码却还是原来的版本,那有没有什么做法,能同时更新到我自己 ...
- 解决Idea中没有SVN标识,不能提交、更新代码
使用idea也不久,今天从svn上down下来的项目导入idea,发现写的代码不能在idea里面更新,记录下解决方案. 步骤 1.点击VCS,然后Enable Version Control Inte ...
- 常见数据库的JDBC URL
转自:http://blog.csdn.net/ring0hx/article/details/6152528 Microsoft SQL Server Microsoft SQL Server JD ...
- Centos7 安装Teamviewer
参考:链接1 链接2 链接3 由于工作原因,需要再Centos7.6下安装Teamviewer,流程如下: 下载 TeamViewer下载 链接 wget https://download.tea ...
- C语言几种排序算法
(1)选择排序算法:选择排序算法是,将第一个数和其它的数比较,将较小的数(从小到大的排列)和第一个数换位,以此类推 #include<stdio.h> int main() { int i ...