算法第四章作业
一、题目描述
4-1 程序存储问题 (40 分)
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
结尾无空行
输出样例:
在这里给出相应的输出。例如:
5
结尾无空行
二、算法描述
现将数组里的数据从小到大排序,使用贪心算法策略:在有限的磁带长度中存储更多数量的程序。
定义sum记录数据的和,定义count记录可存储的程序数量。若sum大于最大长度l,则跳出循环。
三、代码实现
#include <bits/stdc++.h> using namespace std; int main() { int n,l; cin>>n>>l; int a[n]; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); int sum=0; int count=0; for(int i=0;i<n;i++) { sum+=a[i]; if(sum<=l) { count++; } else break; } cout<<count<<endl; return 0; }
四、算法时间复杂度
遍历数组时间复杂度与数组长度有关,即为O(n);
sort排序时间复杂度为O(nlogn);
综上,本算法时间复杂度为O(nlogn);
五、对贪心算法的理解
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。
对于解决贪心算法类问题基本按以下四个步骤进行: 1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解
使用贪心算法的条件:
(1)最优子结构性质。最优解包含其子问题的最优解时,称具有最优子结构性质。
(2)贪心选择性质,整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。
(1)最优子结构性质。最优解包含其子问题的最优解时,称具有最优子结构性质。
(2)贪心选择性质,整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。