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

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

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

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

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

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

输入格式

第 11 行:包含两个用空格隔开的整数,NN 和 WW。

第 2..N+12..N+1 行:每行一个整数,其中第 i+1i+1 行的整数表示第 ii 只小猫的重量 CiCi。

输出格式

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

数据范围

1≤N≤181≤N≤18,
1≤Ci≤W≤1081≤Ci≤W≤108

输入样例:

5 1996
1
2
1994
12
29

输出样例:

2

首先 下面这个方法是错误的是因为:
这步是贪心,要证明正确性的。假设每辆车承重是10。下面数字均表示重量。
第一辆车开始可以放入了1, 2。
现在有第三个重量为5的小猫,你用贪心去写,那么第一辆车剩下的可以承受的重量为2,
加上省下的新开一辆车的承重是10。如果第三只小猫放入新开的一辆车,
那么第一辆车的可承受重量为7,第二辆车的可承受重量为5。如果第4,
第五只的小猫的重量分别为5和7,你用贪心就会多用了一辆车。
正是因为不能确定当前放在哪辆车上是最优解,
所以要将它枚举放在之前使用过的每一辆车和新开一辆车将他放进去这些所有可能的情况,
这是个全集,必然包含了答案

总结一下就是:这个方法是只枚举当前车辆,但是小猫可能放入之前的车辆,所以这个不是正确解

错误代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;const int N = 20;int w[N];
int ans;
bool st[N];
int n, weight;void dfs(int u, int sum_weight, int start, int number)
{if (u >= ans) return ;if (number == n){ans = u;return ;}bool new_group = true;for (int i = start; i < n; i ++ )if (!st[i] && sum_weight + w[i] <= weight){st[i] = true;dfs(u, sum_weight + w[i], i + 1, number + 1);st[i] = false;new_group = false;}if (new_group) dfs(u + 1, 0, 0, number);
}int main()
{cin >> n >> weight;for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);sort(w, w + n);reverse(w, w + n);ans = n;dfs(1, 0, 0, 0);cout << ans << endl;
}

//正确的解题思路:从大到小枚举小猫的重量,依次枚举它可以放入之前枚举过的哪辆车内

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 20;

int ans;
int w[N];
int sum[N];
int n, weight;

void dfs(int u, int car)
{
    if (car >= ans) return ;//若小猫车子数量大于n的返回
    if (u == n) //若已经枚举完n只小猫
    {
        ans = car;
        return ;
    }
    
    for (int i = 0; i < car; i ++ )//枚举之前枚举过的的所有车
        if (sum[i] + w[u] <= weight)//若可以装入小猫,则装入小猫
        {
            sum[i] += w[u];
            dfs(u + 1, car);
            sum[i] -= w[u];
        }
        
    sum[car] = w[u];//若不能装入小猫的新开一辆车
    dfs(u + 1, car + 1);
    sum[car] = 0;
}

int main()
{
    cin >> n >> weight;
    for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);
    
    sort(w, w + n);
    reverse(w, w + n);
    
    ans = n;
    dfs(0, 0);
    
    cout << ans << endl;
    
    return 0;
}

《算法竞赛进阶指南》小猫爬山相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  3. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  4. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  5. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  6. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. 自定义View步骤学习笔记
  2. 福利 | 放送AI华人库试用名额!专项代码找到领域专家
  3. .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度...
  4. ArcGIS Engine空间高效查询(IIdentify方法)
  5. js向head中添加js代码
  6. Java二叉树的构建与遍历
  7. leetcode 501. 二叉搜索树中的众数(Java版)
  8. 远程链接错误:这可能是由于credssp加密oracle修正
  9. Lock的tryLock(long time, TimeUnit unit)方法
  10. linux 批量替换文件内容及查找某目录下所有包含某字符串的文件(批量修改文件内容)...
  11. 6.GD32F103C8T6 定时器的基本使用
  12. 更改VMware虚拟机硬件版本
  13. 标准C语言第四版答案第十章,谭浩强C语言 第十章课后习题
  14. 最新2022亲测可用的免费google翻译api
  15. SpringCloud——pom文件初始配置
  16. 华为云HCIE认证有多难?考试内容是什么?
  17. python英寸和厘米互换_将厘米转换为英寸的Python程序
  18. 90后新晋父母的根据地——万物心选
  19. 第一课:电极的安放位置和测量
  20. win10应用商店无法连接到服务器出错,win10应用商店无法连接网络的具体解决方法...

热门文章

  1. mysql摧毁重建_mysql数据文件破坏后的修复方法
  2. 信必优(Symbio)绽放iWorld数字世界博览会
  3. 我在神奇代码岛研究了一点辅助功能
  4. 营收净利被“腰斩”,市值剩2亿多美元的猎豹移动变“龟速”?
  5. python3实现卡尔曼滤波
  6. Linux 符号系列
  7. python右对齐_用python使句子右对齐
  8. 遇险无线电信标的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. Oracle:PLSQL例外
  10. Python学习——Python安装pil库,操作流程以及安装中出现的问题。