BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
2024-09-08 09:54:19
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1673
题意:
有n个砝码(n <= 1000),重量为w[i]。
你要从中选择一些砝码,使得这些砝码的总重量最大,但不超过c。
w[i]按递增顺序给出,并且保证w[i] >= w[i-1]+w[i-2] (i >= 3)。
题解:
dfs。
因为w[i] >= w[i-1]+w[i-2],所以其实n最大只有45左右(类似斐波那契数列)。
优化:
(1)启发式:优先选砝码(不跳过),并且优先选重量大的砝码,尽早更新ans。
(2)A*搜索:如果当前tot + 剩下砝码的总重(前缀和) < ans,则return。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 1005 using namespace std; int n,c;
int ans=;
int w[MAX_N];
long long sum[MAX_N]; void dfs(int col,int tot)
{
if(tot>c) return;
ans=max(ans,tot);
if(col>n) return;
if(tot+sum[n]-sum[col-]<=ans) return;
dfs(col+,tot+w[col]);
dfs(col+,tot);
} void read()
{
cin>>n>>c;
for(int i=n;i>=;i--)
{
cin>>w[i];
}
} void solve()
{
sum[]=;
for(int i=;i<=n;i++)
{
sum[i]=sum[i-]+w[i];
}
dfs(,);
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
最新文章
- php地址赋值值和传值赋值
- js中块级作用域
- 每天一个linux命令(46):ping命令
- js插件zClip实现复制到剪贴板功能
- json字符串和对象的相互转化
- C++ 窗口可改风格
- SecureCRT连接虚拟机中的Linux系统(Ubuntu)_Linux教程
- Linux下ping,telnet,ssh命令的比较
- Linux - 有效群组(effective group)与初始群组(initial group),groups,newgrp
- 【Swift 4.0】扩展 WCDB 支持 SQL 语句
- 使用 Apache Web 配置多个站点
- 5.form表单验证
- Docker(二十三)-Docker使用pipework配置本地网络
- WepE
- bzoj 1415 期望dp + 记忆化搜索
- node-nginx二级域名添加配置
- throws和throw的用法例子以及检测和非检查异常
- Leetcode 700. 二叉搜索树中的搜索
- phpstudy开启时mysql不开启时红色灯
- 【学习笔记】深入理解js原型和闭包(7)——原型的灵活性
热门文章
- 想提升java知识的同学请进
- 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积
- LeetCode Recover Binary Search Tree——二查搜索树中两个节点错误
- Node.js 抓取电影天堂新上电影节目单及ftp链接
- redmine 自己定义字段mysql表结构
- document.readyState和xmlhttp.onreadystatechange
- Struts2实现文件的上传与动态下载功能。
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
- vsftpd 自动安装脚本
- Linux下比较常用的svn命令