算法训练 装箱问题(贪心,动态规划,蓝桥杯,C++)
算法训练 装箱问题
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
样例输入
24
6
8
3
12
7
9
7
样例输出
0
思路与解析:
1、虽然题干提示这是一道动态规划,但显然这是一道比较简单基础的贪心,首先我们考虑这道题时要分析到如何能让剩余的空间最小,那么你就会想到尽可能装大的物品,装的大,才是最贪的,剩下的空间一定会很小,那我们初期思路就可以时先把物品的重量排序:(STL真好用)
#include<algorithm>sort(&a[0],&a[n]);
2、比如说我们这时容量为10,4个物品,分别为2,3,1,4,那么sort之后数组就变成了1 2 3 4,然后我们可以从后(n-1)往前(0)开始遍历,满足条件如果物品小于容量,那么容量就减去物品大小:
for(int i =n - 1 ;i >= 0;i--){if(box >= a[i]){box -= a[i];}}
※正当我兴高采烈的提交代码时,样例却只给了我80分(不得不说数据真的很水,要不然40都得不到)
这时开始思考有没有特殊的情况没有考虑到?
比如:容量为10 , 5个物品,分别为1 2 3 4 5,那么如果从后往前看的话,先装5,再装4,就已经不能再装了,剩余空间为1,但是我们肉眼能判断 1 + 2 + 3 + 4 == 10,应该装法是 4 3 2 1才对,那么这时思路就要改变,算法要从O(n)变成O(n²),因为第一个装的物品不同的情况下,最后剩余的空间也不同,那么就要遍历每一种情况开头时候他的剩余空间,然后取这些剩余空间的最小值就好啦!
int ans = box; //答案最初等于箱子的容量
for(int i =n - 1 ;i >= 0;i--) //i是第一个装的物品{min_val = box; //每一次最小值要重置为箱子初始的容量for(int j = i ;j>= 0;j-- ) //第一个是i的情况下,向前遍历{if(min_val >= a[j]) //如果容量比物品大,那就装!{min_val -= a[j]; //减去物品}}ans = min(ans,min_val); //在答案和每次剩余容量中取最小值}
3、本题可能用到了dp,但是我暂时还没有去想,大家可以看看其他大佬的代码和思路
最后附上完整AC代码:
#include <stdio.h>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;int main()
{int box,n,min_val;int a[32]; ///装物品cin >> box >> n;int ans = box;for(int i = 0;i < n; i++){cin >> a[i];}sort(&a[0],&a[n]);for(int i =n - 1 ;i >= 0;i--){min_val = box;for(int j = i ;j>= 0;j-- ){if(min_val >= a[j]){min_val -= a[j];}}ans = min(ans,min_val);}cout << ans;return 0;
}
后语:本人一般比较喜欢更简洁的算法思想,平常一般看到其他大佬的简洁代码不仅感叹,所以代码总体来说都比较短,喜欢把这种高效率的算法分享给大家,本题若有更好的算法还请一起交流!
算法训练 装箱问题(贪心,动态规划,蓝桥杯,C++)相关推荐
- 试题 算法训练 一元三次方程求解---蓝桥杯
试题 算法训练 一元三次方程求解 题目描述: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a ...
- 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)
问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...
- 试题 算法训练 无聊的逗 - 蓝桥杯
状态间的比较 (暴力检索) : 选出在两根一样长的情况下长度最长的, 实际就是2^n 种组合比较,在状态检索中, 找到 不同状态(无重复的木棍)的组合 并且 木棍总长度相等 ...
- 矩阵快速幂+动态规划=蓝桥杯 垒骰子
矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...
- java 算法提高 邮票面值设计 蓝桥杯1046
java 算法提高 邮票面值设计 蓝桥杯1046 算法提高 邮票面值设计 思路 代码 算法提高 邮票面值设计 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13) ...
- 基础算法题——复数计算(蓝桥杯算法训练 P1103)
复数计算题目( P1103) 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现 ...
- Java 01背包【动态规划·蓝桥杯练习题】(相信杨超越,相信锦鲤,默默努力,其它的看天意)
锦鲤镇楼 1.题目描述: 时间限制:1.0s 内存限制:256.0MB 关键字:01背包 动态规划 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高 ...
- 算法之搜索(备战蓝桥杯类似题型)
搜索分为DFS和BFS(深度优先搜索和广度优先搜索),dfs的基础题型可见排列组合问题,这篇文章主要记录一下遇到的几种连通块问题. 如果把深度优先搜索和广度优先搜索比作两个人的话,这两个人像性格迥异的 ...
- 蓝桥杯 ALGO-21算法训练 装箱问题 java版
问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...
最新文章
- torch.nn.softmax()
- CenTos6.8安装Heartbeat
- mysql中case when then的用法
- android5.0(Lollipop) BLE Peripheral牛刀小试
- 从源码角度深入分析log4j配置文件使用
- python-argparse批量修改后缀名-batch_file_rename.py
- 如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...
- Apollo自动驾驶入门课程第①讲—无人驾驶概览
- mysql集群如何保障数据分布均匀_如何保证数据库集群时候,主从库一致性的问题?...
- mysql57包解压安装_mysql5.7解压包安装教程
- Asp.Net MVC4入门指南(7):给电影表和模型添加新字段
- gns3 桥接linux,GNS3之与本机桥接步骤
- winRAR去广告版
- [转载] 高大上的 CSS 效果:Shape Blobbing
- 【Python学习 】Python实现的FTP上传和下载功能
- 腾讯直播与 JAVA整合_JAVA对接腾讯云直播如何实现 JAVA对接腾讯云直播实现代码...
- Carson带你学Android:请收好这一份全面详细的Android学习指南
- 北京尚学堂退课退课,口碑还不错
- 麒麟桌面系统配置samba共享
- 02-关于画布、Artboard(画板)