Description

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

经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了

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

索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1 , C2 , …, CN 。

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

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

Input

第 1 行:包含两个用空格隔开的整数,N 和 W   ( 1 ≤ N ≤ 18 , 1 ≤ W ≤ 108 )。

第 2..N + 1 行:每行一个整数,其中第 i + 1 行的整数表示第 i 只小猫的重量 Ci  ( 1 ≤ Ci ≤ 108 ) 。

Output

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

Sample Input

5 1996
1
2
1994
12
29

Sample Output

2

思路 :利用dfs搜索所有小猫乘坐缆车的可能组合,并更新最小缆车数量取值。

向每只小猫分配缆车的情况:将小猫与目前租有的所有缆车进行匹配,或者自己单独新租一辆缆车


代码(含注释):

#include<bits/stdc++.h>
using namespace std;#define N 22int n, w, k, ans=100;//k表示当前已租有的缆车数量
int arr[N];//记录所有小猫体重
int sum[N]; //记录各缆车当前承载重量bool cmp(int a, int b) {return a > b;
}//为第x只小猫匹配缆车
void dfs(int x) {if (x == n + 1) {//若x==n+1说明已经为前n只小猫分配好缆车ans = min(ans, k);return;}//将小猫分配到已租有的缆车for (int i = 1; i <= k; i++) {if (sum[i] + arr[x] <= w) {sum[i] += arr[x];dfs(x + 1);sum[i] -= arr[x];}}//当前小猫单独新租一辆缆车(剪枝:如果新租一辆后数量大于ans则没必要新租)if (k + 1 < ans) {k++;sum[k] += arr[x];dfs(x + 1);sum[k] -= arr[x];//还原现场k--;//还原现场}}int main() {scanf("%d%d", &n, &w);for (int i = 1; i <= n; i++)scanf("%d", arr + i);//剪枝:搜索顺序优化,先为大重量小猫分配缆车sort(arr + 1, arr + 1 + n, cmp);//给第一只小猫单独租一辆缆车sum[1] += arr[1];k = 1;dfs(2);printf("%d\n", ans);return 0;
}

代码(无注释):

#include<bits/stdc++.h>
using namespace std;#define N 22int n, w, k, ans=100;
int arr[N];
int sum[N]; bool cmp(int a, int b) {return a > b;
}void dfs(int x) {if (x == n + 1) {ans = min(ans, k);return;}for (int i = 1; i <= k; i++) {if (sum[i] + arr[x] <= w) {sum[i] += arr[x];dfs(x + 1);sum[i] -= arr[x];}}if (k + 1 < ans) {k++;sum[k] += arr[x];dfs(x + 1);sum[k] -= arr[x];k--;}}int main() {scanf("%d%d", &n, &w);for (int i = 1; i <= n; i++)scanf("%d", arr + i);sort(arr + 1, arr + 1 + n, cmp);sum[1] += arr[1];k = 1;dfs(2);printf("%d\n", ans);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. 计算相机采集帧率C实现
  2. 显示文字_在 iPhone 上调整显示与文字大小,让眼睛更舒服
  3. urllib2设置代理
  4. vite2.1 最新alias别名设置方式
  5. 如何创建自定义进度栏
  6. 工作144:时间戳格式化
  7. 如何在关闭ssh连接的情况下,让进程继续运行?
  8. 一文看懂JUC之AQS机制
  9. 理解JavaScript原型
  10. [Tools 之]online bookmark 在线书签
  11. java只有值传递_为什么说java中只有值传递
  12. 数据库多表查询关联查询SQL语句
  13. 2019年物联网行业市场研究报告
  14. 计算机实验室建设论证报告,计算机实验室实习报告-报告.doc
  15. DOS命令是如何操作目录和文件夹的?
  16. 通过路由器设置,不用IPTV盒子,局域网内、局域网外任意设备随时随地观看网络电视直播
  17. python-字符串的操作方法_format_列表的操作
  18. Torchvision transforms 总结
  19. android ram rom测试工具,RAM与ROM测试方法
  20. Orcale数据库简介

热门文章

  1. 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
  2. Codeforces Round #481 (Div. 3) F. Mentors 思维
  3. 不同服务器同步文件,不同服务器同步文件夹吗
  4. 赵福全:疫情对中国汽车产业未来发展影响的预判
  5. R软件下载及安装过程
  6. 应届生软件测试薪资大概多少?
  7. python+opencv电表读数自动识别,电表电量自动读取
  8. 用echarts实现中国疫情地图
  9. 未来三年中职生涯规划计算机应用,中职生职业生涯规划书 计算机
  10. 网络安全等保定级_网络安全等级保护定级指南