原题链接

第一眼还以为是贪心,然后随便找了几组例子瞬间推翻贪心的想法。发现\(n\leqslant18\),显然是用爆搜+剪枝。

爆搜主体我是对小猫进行枚举,判断增添缆车,其实这是一个比较慢的搜法,而另一个更快的搜法是通过枚举缆车,这样只要剪一点枝即可过,而我用的方法则需要更多剪枝才可过。

  1. 显然当搜索过程中若缆车的数量已经比之前的搜出的缆车数量多,即可直接返回,因为当前不可能比之前的更优。
  2. 枚举小猫时,为了可以不用枚举已经登上缆车的小猫,可以使用双向链表来储存小猫,递归前将这次枚举的小猫\(O(1)\)删除,回溯时再接回上去即可。
  3. 输入时算出小猫总重,然后在搜索时记录还没登上缆车的小猫的总重,若剩余总重可以塞到一个缆车里,就直接判断并返回。
  4. 用剩余总重除以缆车能承载的最大重量(上取整),显然后面需要的缆车不可能优于这个数,因此直接和记录的最少需要缆车数比较,若超过即可直接返回。
  5. 开一个数组,使用压位的方式记录某个决策下需要的最小缆车数,因为\(n\leqslant18\),所以可以开得下。

    上述剪枝中\(1,4,5\)是重要的剪枝,缩短搜索时间主要靠这几个。

    另外,我建议搜索时枚举缆车更好,这样剪枝少,且代码简单,不用想我打的这么麻烦。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 20;
struct dd {
int pre, suc, wht;
};
dd a[N];
int v[300000], n, w, s = 1e9, mi;
int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c<'0' || c>'9'; c = getchar())
p = (c == '-' || p) ? 1 : 0;
for (; c >= '0'&&c <= '9'; c = getchar())
x = x * 10 + (c - '0');
return p ? -x : x;
}
int comp(dd x, dd y)
{
return x.wht > y.wht;
}
inline int minn(int x, int y)
{
return x < y ? x : y;
}
void de(int x)
{
a[a[x].pre].suc = a[x].suc;
a[a[x].suc].pre = a[x].pre;
}
void con(int x)
{
a[a[x].pre].suc = x;
a[a[x].suc].pre = x;
}
void dfs(int nw, int k, int t, int tw, int sol)
{
int i = a[n + 1].pre;
if (s == mi)
return;
if (k >= s)
return;
if (ceil(tw / w) + k >= s)
return;
if (tw <= w)
{
s = minn(s, nw + tw <= w ? k : k + 1);
return;
}
if (t == n)
{
s = minn(s, k);
return;
}
if (nw + a[i].wht > w)
{
nw = 0;
k++;
}
if (k >= s)
return;
for (i = a[0].suc; i<=n; i = a[i].suc)
if (k < v[sol | (1 << (i - 1))] && nw + a[i].wht <= w)
{
de(i);
v[sol | (1 << (i - 1))] = k;
dfs(nw + a[i].wht, k, t + 1, tw - a[i].wht, sol | (1 << (i - 1)));
con(i);
}
}
int main()
{
int i, o = 0;
n = re();
w = re();
for (i = 1; i <= n; i++)
a[i].wht = re();
sort(a + 1, a + n + 1, comp);
for (i = 1, a[0].suc = 1, a[n + 1].pre = n; i <= n; i++)
{
o += a[i].wht;
a[i].pre = i - 1;
a[i].suc = i + 1;
}
memset(v, 60, sizeof(v));
de(1);
mi = ceil(o / w);
v[1] = 1;
dfs(a[1].wht, 1, 1, o - a[1].wht, 1 << (n - 1));
printf("%d", s);
return 0;
}

CODE[VS]4228 小猫爬山 小猫爬山的更多相关文章

  1. 基于爬山算法求解TSP问题(JAVA)

    一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  2. codevs 4228 小猫爬山 【搜索】By cellur925

    题目描述 Description Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). ...

  3. Python 第六篇(中):面向对象编程中级篇

    面向对象编程中级篇: 编程思想概述: 面向过程:根据业务逻辑从上到下写垒代码  #最low,淘汰 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 #混口饭吃 def add(ho ...

  4. 论.net平台的切身感触(惑)

    这篇博客只是作者客观看法,不喜勿喷,条条大路通罗马,路不同风景也不一样,接下来的路该怎么走? 简介:作者.net程序员一枚,工作已有四年,接触过.net平台winform,webform,mvc的开发 ...

  5. [学习笔记] 模拟退火 (Simulated Annealing)

    真没想到这东西真的在考场上用到了...顺便水篇blog以示诈尸好了(逃 模拟退火算法 模拟退火是一种随机化算法, 用于求函数的极值qwq 比如给出一个问题, 我们要求最优解的值, 但是可能的方案数量极 ...

  6. vue表单详解——小白速会

    一.基本用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定. 但 v-model 本质上不过是语法糖.它负责监听用户的 ...

  7. 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...

  8. BeetleX.FastHttpApi之测试插件集成

    说到Webapi测试工具相信很多人想起Swagger,它可以非常方便地集成到项目中并进行项目Webapi接口测试.而BeetleX.FastHttpApi在新版本中也提供类似的插件,只需要引用这个插件 ...

  9. APISpace 周公解梦API接口 免费好用

    <周公解梦>,是根据人的梦来卜吉凶的一本解梦书籍,它对人的七类梦境进行解述.   周公解梦API,周公解梦大全,周公解梦查询,免费周公解梦.   APISpace 有很多免费通用的API接 ...

随机推荐

  1. Oracle11g服务详细介绍

    Oracle11g服务详细介绍及哪些服务是必须开启的? Oracle ORCL VSS Writer Service Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Se ...

  2. openstack 资料

    调用流程 https://blog.csdn.net/bill_xiang_/article/details/72909927

  3. mui-图文列表 图片大小问题

    下面是源码,不能调节图片大小 <ul class="mui-table-view"> <li class="mui-table-view-cell mu ...

  4. Java中字节流如何转字符流,OutputStreamWriter用法

    OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象  绑定数 ...

  5. 微信小程序开发攻略

    首先,需要明确的一点是,小程序开发就是前端开发的一个小分支. 其次,小程序开发框架是一个精简版的React ,并且开发比较简单 . 第一步 获取AppId 小程序注册入口http://https:// ...

  6. struts2前后台传值的三种方法

    原文地址: http://laokaddk.blog.51cto.com/368606/1340816 多的不说,直接上代码; struts.xml代码: <?xml version=" ...

  7. Redis备份及回收策略

    Redis备份(持久化) Redis备份存在两种方式: 1.一种是"RDB".是快照(snapshotting),它是备份当前瞬间Redis在内存中的数据记录; 2.另一种是&qu ...

  8. SpringCloud报错:Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

    今天启动用eureka的服务消费者时,一直出现问题. SpringCloud报错: Caused by: org.springframework.context.ApplicationContextE ...

  9. JS 解决json字符串转换成json树形输出

    问题: 后台获取一个字符串,格式为  string +jsonList+string+..... 就是传过来一堆数据,然后其中包含了一个json格式的list, 我们希望能将它输出成树形结构显示,能够 ...

  10. JavaScript oop proto与prototype原型图

    [_proto_与prototype] 1.prototype(函数的原型):函数才有prototype.prototype是一个对象,指向了当前构造函数的引用地址. 2._proto_(对象的原型对 ...