第四章上机实践报告
一、实践题目
本次实践的题目为4-1程序存储问题
二、问题描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
简单点说,就是要求我们把相对小的程序存放在磁带上,使磁带上的存储尽可能多的程序。
用数学模型来表示的话就是给出一组数组与一个固定的数字,将数组中的元素相加,得出小于或等于给定的数,要求加数数目最多。
三、算法描述
该算法贪心选择的意义就是使剩余的磁带长度极大化,以便能够放入更多的程序。
按程序的大小按照按非升序进行排列,然后按顺序将程序放到磁带上,每放入一个程序,磁带长度减去程序大小,直到磁带容不下一个完整的程序则结束。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 int l; 9 cin >> n; 10 cin >> l; 11 int a[100]; 12 for(int i = 0;i < n;i++) 13 { 14 cin >> a[i]; 15 } 16 sort(a,a + n); 17 int num = 0; 18 for(int i = 0;i < n;i++) 19 { 20 if(l >= a[i]) 21 { 22 num++; 23 l -= a[i]; 24 } 25 else 26 break; 27 } 28 cout << num; 29 system("pause"); 30 return 0; 31 }
设E = {1,2,…,n}为所给的程序集合。由于E中程序按大小的非升序排列,故程序1占用最短的磁带长度。
设A(包含于E)是所给的程序存储问题的一个最优解,且A中程序也程序大小进行非升序排列,A中的第一个活动是k。
若k = 1,则A是一个以贪心选择开始的最优解。
若A > 1,则设B = A – {k} U {1}。由于f1 <= fk,且A中的程序是可放入磁带上的,故B中的程序也是可的放入磁带上的。又由于B中程序个数与A中程序个数相同,且A是最优的,故B也是最优的。也就是说,B是以贪心选择程序1开始的最优程序存储。如果说B不是最优解,那么因为fk >= f1,A也不可能是最优解,与已知相矛盾。
由此可见,总存在以贪心选择开始的最优程序存储方案。
四、算法时间及空间复杂度分析
算法时间复杂度:
算法中使用了C++本身自带的sort函数,其运用的是快速排序,时间复杂度为O(N logN),模拟程序放入磁带的过程时间复杂度为O(N),所以算法的时间复杂度为:O(N logN) + O(N) = O(N logN)
空间复杂度:
同样的道理,算法的空间复杂度与快速排序的空间复杂度相等,同样为O(1)
五、心得体会
这道题相对来说是很简单的,当时它却很好的表现了什么是“贪心算法”,贪心算法就是要尽可能的“贪”,总体上与动态规划相似,都是要取得最优解,但是贪心算法往往是自上而下,得到的就解都是相对于当前的。
虽然比起动态规划,贪心算法的普适性不太高,但是他胜在简便,在二者都适用的情况下,选择贪心算法进行编程会跟方便。
原文地址:https://www.cnblogs.com/Raido/p/11892118.html
- Spring cloud Zuul Filter 使用小经验
- Spring Cloud Eureka REST 接口
- Spring Cloud Eureka 控制台快速查看Swagger API文档
- Spring Cloud Feign 启动UnsatisfiedDependencyException
- Spring Cloud Zuul结合Smconf配置中心动态进行IP黑名单限制
- 高性能NIO框架Netty入门篇
- Spring Boot Web 静态文件缓存处理
- hbuilder 开发APP填坑经验
- hbuilder APP 定位提示苹果审核不通过
- hbuilder 开发5+ APP采坑记录
- Spring Cloud如何提供API给客户端
- 5分钟学会Spring Boot自定义属性和自动配置
- 创建一个Spring Security OAuth认证服务
- Zipkin和微服务链路跟踪
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Glide-图片加载框架全解(一)- 基本用法
- Python全栈(六)项目前导之1.Redis介绍及数据类型介绍
- 网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
- 网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析
- 这次,我把Android事件分发机制翻了个遍
- 网络请求框架OkHttp3全解系列 - (三)拦截器详解1:重试重定向、桥、缓存(重点)
- Python全栈(七)Flask框架之4.Flask模板继承与案例练习
- 你想要的系列:网络请求框架OkHttp3全解系列 - (四)拦截器详解2:连接、请求服务(重点)
- 不会玩阴阳师的我带你一键下载《阴阳师:百闻牌》所有卡牌并调用百度OCR识别文字信息
- 微信小程序生命周期学习笔记-页面篇
- Python 字典 使用技巧
- 微信小程序生命周期学习笔记-组件
- C语言入门系列之2.数据类型、运算符和表达式
- 树莓派的cpu与gpu通信设计浅析
- Python全栈(七)Flask框架之5.视图高级--类视图和蓝图