算法训练 装箱问题

资源限制
时间限制: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. 试题 算法训练 一元三次方程求解---蓝桥杯

    试题 算法训练 一元三次方程求解 题目描述: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a ...

  2. 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)

    问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...

  3. 试题 算法训练 无聊的逗 - 蓝桥杯

    状态间的比较 (暴力检索) :       选出在两根一样长的情况下长度最长的,     实际就是2^n 种组合比较,在状态检索中,     找到 不同状态(无重复的木棍)的组合 并且 木棍总长度相等 ...

  4. 矩阵快速幂+动态规划=蓝桥杯 垒骰子

    矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...

  5. java 算法提高 邮票面值设计 蓝桥杯1046

    java 算法提高 邮票面值设计 蓝桥杯1046 算法提高 邮票面值设计 思路 代码 算法提高 邮票面值设计 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13) ...

  6. 基础算法题——复数计算(蓝桥杯算法训练 P1103)

    复数计算题目( P1103) 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现 ...

  7. Java 01背包【动态规划·蓝桥杯练习题】(相信杨超越,相信锦鲤,默默努力,其它的看天意)

    锦鲤镇楼 1.题目描述: 时间限制:1.0s 内存限制:256.0MB 关键字:01背包 动态规划 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高 ...

  8. 算法之搜索(备战蓝桥杯类似题型)

    搜索分为DFS和BFS(深度优先搜索和广度优先搜索),dfs的基础题型可见排列组合问题,这篇文章主要记录一下遇到的几种连通块问题. 如果把深度优先搜索和广度优先搜索比作两个人的话,这两个人像性格迥异的 ...

  9. 蓝桥杯 ALGO-21算法训练 装箱问题 java版

    问题描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩 ...

最新文章

  1. torch.nn.softmax()
  2. CenTos6.8安装Heartbeat
  3. mysql中case when then的用法
  4. android5.0(Lollipop) BLE Peripheral牛刀小试
  5. 从源码角度深入分析log4j配置文件使用
  6. python-argparse批量修改后缀名-batch_file_rename.py
  7. 如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...
  8. Apollo自动驾驶入门课程第①讲—无人驾驶概览
  9. mysql集群如何保障数据分布均匀_如何保证数据库集群时候,主从库一致性的问题?...
  10. mysql57包解压安装_mysql5.7解压包安装教程
  11. Asp.Net MVC4入门指南(7):给电影表和模型添加新字段
  12. gns3 桥接linux,GNS3之与本机桥接步骤
  13. winRAR去广告版
  14. [转载] 高大上的 CSS 效果:Shape Blobbing
  15. 【Python学习 】Python实现的FTP上传和下载功能
  16. 腾讯直播与 JAVA整合_JAVA对接腾讯云直播如何实现 JAVA对接腾讯云直播实现代码...
  17. Carson带你学Android:请收好这一份全面详细的Android学习指南
  18. 北京尚学堂退课退课,口碑还不错
  19. 麒麟桌面系统配置samba共享
  20. 02-关于画布、Artboard(画板)

热门文章

  1. 企业激励机制的思考(续)
  2. 金蝶个版本下载地址,记得保存收藏。
  3. Debian修改系统默认语言
  4. python控制CAD画图
  5. MobileNetV1 MobileNetV2 简介
  6. Mac word 2016 编辑快捷键
  7. 手机和计算机错误怎么办,手机、电脑进水了要怎么办?三种常见错误!绝大多数人都这么干!...
  8. 解决windows11 状态栏 qq或企点提醒不明显,不弹窗问题
  9. 七个要素帮你打造现象级手游!优化程度堪比《QQ飞车》
  10. 巨头入局,无人货架小玩家离场倒计时