目录

  • 题目描述
  • 分析
    • 优化1
    • 优化2
  • Code

题目描述

翰翰和达达饲养了 N N N 只小猫,这天,小猫们要去爬山。

经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

翰翰和达达只好花钱让它们坐索道下山。

索道上的缆车最大承重量为 W W W,而 N N N 只小猫的重量分别是 C 1 、 C 2 … … C N C_1、C_2……C_N C1​、C2​……CN​。

当然,每辆缆车上的小猫的重量之和不能超过 W W W。

每租用一辆缆车,翰翰和达达就要付 1 1 1 美元,所以他们想知道,最少需要付多少美元才能把这 N N N 只小猫都运送下山?

输入格式
第 1 1 1 行:包含两个用空格隔开的整数, N N N 和 W W W。

第 2.. N + 1 2..N+1 2..N+1 行:每行一个整数,其中第 i + 1 i+1 i+1 行的整数表示第 i i i 只小猫的重量 C i C_i Ci​。

输出格式
输出一个整数,表示最少需要多少美元,也就是最少需要多少辆缆车。

数据范围
1 ≤ N ≤ 18 , 1≤N≤18, 1≤N≤18,
1 ≤ C i ≤ W ≤ 1 0 8 1≤C_i≤W≤10^8 1≤Ci​≤W≤108

输入样例:

5 1996
1
2
1994
12
29

输出样例:

2

分析

利用dfs的方法,显然当考虑C中每只猫时有两个选择:

  1. 将该猫放入已经租好的缆车集合中的某个缆车(如果能放进)。
  2. 新租一个缆车,然后把猫放进去。

因此,枚举一遍所有的猫,让后让其走两条dfs的路径。


优化1

先定义ans:当前最优方案的租缆车数(最小);cnt:某一层深搜时的已租了的缆车数量。
显然,cnt >= ans时已经没有必要再在该方案下枚举后面的猫了,因为cnt是不减的,所以在此条件下直接return


优化2

可以看出,体重较大猫比体重较小猫选择缆车的机会要,因而让机会少的体重较大猫先来对缆车进行选择,由此降低后期 “因缆车数不足而新租” 的情况减少,对应地,dfs生成的树层数会变少,分支数会变多,从而找到最优解的速度会更快。


Code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int N = 20;int cost[N];
vector<int> c;
int n, w, ans = 0x3f3f3f3f;bool cmp(int a,int b){return a > b;
}void dfs(int p, int cnt){          //p指向第p只猫   cnt表示现在租了cnt个缆车int cat = c[p];if(p >= c.size() + 1){      //终点ans = min(ans, cnt);return;}if(cnt >= ans)      return;         //剪枝  cnt已经比已有方案中缆车数更大了没必要往下走for(int i = 1;i <= cnt;i ++){         //将猫放入已有的缆车中if(cost[i] + cat <= w){cost[i] += cat;dfs(p + 1, cnt);cost[i] -= cat;}}cost[cnt + 1] = cat;                //新开一个缆车dfs(p + 1, cnt + 1);cost[cnt + 1] = 0;
}int main(){cin >> n >> w;for(int i = 0;i < n;i ++){int t;cin >> t;c.push_back(t);}sort(c.begin(), c.end(), cmp);       //C大的先选择dfs(0, 1);cout << ans << endl;return 0;
}

小猫爬山(DFS+剪枝)相关推荐

  1. AcWing - 165 小猫爬山(dfs)

    题目链接:点击查看 题目大意:给出n只小猫坐索道下山,索道上缆车的最大承重为W,而n只小猫的重量分别为C1,C2--Cn,要求每辆缆车上的小猫重量之和不能超过W,问最少需要几个缆车才能将所有的小猫都运 ...

  2. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

  3. DFS剪枝优化 小猫爬山 数独

    DFS剪枝策略总结 优化搜索顺序 优先搜索分支数少(剩余选择少)的情况 排除等效冗余 若对顺序没有要求 可以将排列转化为组合 可行性剪枝 不合法的情况不进行搜索 最优化剪枝 若当前的"消耗& ...

  4. tyvj P2018 「Nescafé26」小猫爬山 解题报告

    P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经 ...

  5. acwing165.小猫爬山

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

  6. 洛谷 P1361 小猫爬山

    P1361 小猫爬山 题目描述 WD和LHX饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了. WD和LHX只好花钱让它们坐索道下山.索道 ...

  7. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  8. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  9. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  10. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

最新文章

  1. 关于敏捷开发的最佳实践和工具
  2. springboot整合springSecurity使用
  3. 数据库进阶系列之三:使用Logminer解析Oracle日志
  4. java排序算法之冒泡排序
  5. thinkphp5运行原理_ThinkPHP5.1~5.2全版本远程代码执行高危漏洞预警
  6. 有哪些论文降重的方法?
  7. linuxshell如何实现进度条效果
  8. 1.7 正则表达式【匹配空白字符和非空白字符】
  9. mac automator 自动操作 使用初探
  10. 浅谈 “空指针、野指针、void*”
  11. 转载 CATransform3D 矩阵 m11–m44每个的含义
  12. 私域运营中引流加爆微信好友的方法
  13. MATLAB实现数字滤波器的频带变换
  14. andorid之摄像头驱动流程
  15. Goldengate Monitor Agent 安装
  16. 头条 上传图片大小_如何解决小说封面上传失败(不符合网站标准、缺少信息)的问题?...
  17. 制度是绝情的,管理是无情的,执行是合情的
  18. 大学生对AI的看法调查
  19. 社交电商独角兽meesho融资5.7亿美元,海外S2B2C火热
  20. 共享计算机资源教案,《共享网上邻居资源》课后教学反思

热门文章

  1. java中的消息队列
  2. oracle 审计 分区表,oracle分区表的分类及测试
  3. 【jquery】jquery $.fn $.fx是什么意思
  4. 威固新能源GO野 伊士曼旗下品牌威固加速布局新能源车后市场
  5. 旅游流的概念_国内旅游流综述
  6. 行业分析报告-全球与中国客户满意度(CSAT)调查软件市场现状及未来发展趋势
  7. MySQL学习笔记整理(上部)
  8. 喜茶奶茶技术培训哪里学?
  9. 暴雪battle注册账户不转到中国
  10. [MIT6.006 算法导论] 1. Peak Finding 寻峰