当前位置: 首页 > news >正文

[贪心算法]忍者道具

描述

忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?

输入

第一行包含两个用空格隔开的整数,N和W。
接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。

输出

输出一个整数,最少需要多少个工具包。

样例输入

5 1996
1
2
1994
12
29

样例输出

2

提示

对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。

解题分析

这题的话蛮有意思的,因为如果单从思路上入手的话其实题目本身是不难的,可以用递归回溯法,也可以用动态规划的方法。不过实际上这两种方法在测试数据时都容易超时,这题本质上可能需要一种贪心的思维。什么意思呢?首先,我们要明白,要想要使用的工具包最少,那么我们必须最大化我们使用的工具包内部的存储空间,问题的关键就在于,我们怎么去放物品才能最高效地利用背包的空间。这里我们可以思考一下,是谁阻碍了我们使用包包?是那些大的物品!所以我们可能要优先去处理那些比较大的物品。所以,我们读入物品后,对整个物品序列进行一个排序,按照从小到大。然后,这个时候我们去计算一下可能使用的包包最少的数量和最大的数量,接着,我们使用一个循环,在这个循环里面,我们的目标是先放好大的物品,然后再考虑小物品的死活。我们把整个序列最大的物品先扔进一个包里,然后去寻找前面的物品,当找到一个最大的,且可以放入这个包包的物品的时候,我们放入,然后依次这样做,直到我们现在处理的这个包包容量达到最大,那么我们增加我们使用的包的数量。外层的for循环相当于先预支给我们那么多包,然后内层的while循环就在利用预支的这些包进行一个贪心最大化放物品,当我们使用的包超过预支的包的时候,我们就继续多预支一个包,以此类推。

代码实现
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;
int N,W;
vector<int> kits;int findKit(int curSize,int last){if(last==0) return -1;if(kits[last-1]+curSize<=W){return last-1;}if(last==1){return -1;}for(int i=last-2;i>=0;i--){if(curSize+kits[i]<=W && curSize+kits[i+1]>W){return i;}}return -1;
}int main(){scanf("%d%d",&N,&W);kits.resize(N);int totalWeight=0;for(int i=0;i<N;i++){scanf("%d",&kits[i]);totalWeight+=kits[i];}sort(kits.begin(),kits.end());int minBags=totalWeight%W==0?totalWeight/W:totalWeight/W+1;int maxBags=N;int usedBags=0;for(int nBags=minBags;nBags<=maxBags;nBags++){while(usedBags<=nBags){int curSize=0;int last=kits.size()-1;curSize+=kits[last];vector<int> arranged;arranged.push_back(last);while(curSize<=W){int index=findKit(curSize,last);if(index==-1){usedBags++;break;}else{arranged.push_back(index);curSize+=kits[index];last=index;}}int len1=arranged.size();for(int i=0;i<len1;i++){kits.erase(kits.begin()+arranged[i]);}if(kits.size()==0){break;}}if(kits.size()==0){cout<<nBags<<endl;break;}}return 0;
}

相关文章:

  • Redis精要
  • yolov8训练中出现问题
  • Linux 一键部署 Nginx1.26.1 + ModSecurity3
  • Docker的常见问题
  • LoRa126X系列LoRa模块:专为物联网设计而生
  • adb 截屏和录屏命令
  • nginx安装教程
  • Python 学习 第四册 第8章 结构化的文本文件
  • 【LeetCode热题 100】三数之和
  • Python日志管理利器:如何高效管理平台日志
  • 【机器学习】智能创意工厂:机器学习驱动的AIGC,打造未来内容新生态
  • CentOS中的rename命令
  • 别让日志拖垮网站速度
  • Python多语言欧拉法和预测校正器实现
  • 20240621每日后端---------如何优化项目中的10000个if-else 语句?
  • 自己简单写的 事件订阅机制
  • FineReport中如何实现自动滚屏效果
  • java中的hashCode
  • js学习笔记
  • Laravel 菜鸟晋级之路
  • Lsb图片隐写
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 产品三维模型在线预览
  • 订阅Forge Viewer所有的事件
  • 记一次和乔布斯合作最难忘的经历
  • 开源地图数据可视化库——mapnik
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 浅谈Golang中select的用法
  • 如何实现 font-size 的响应式
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 最近的计划
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ‌移动管家手机智能控制汽车系统
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #APPINVENTOR学习记录
  • #pragma once
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (02)vite环境变量配置
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Python) SOAP Web Service (HTTP POST)
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (二)Eureka服务搭建,服务注册,服务发现
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (回溯) LeetCode 131. 分割回文串
  • (六)Hibernate的二级缓存
  • (一)SpringBoot3---尚硅谷总结
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 服务 ServiceController
  • .NET 中 GetProcess 相关方法的性能
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET程序员迈向卓越的必由之路
  • .NET轻量级ORM组件Dapper葵花宝典