算法第四章作业
一、实践题目名称
4-1 程序存储问题
-
1.1 问题描述
-
1.2 算法描述
在一个固定长度L的磁带上,尽可能的存储文件。根据这个思想,我们可以考虑用贪心算法解决。
贪心策略:优先存储磁带长度小的程序,以此达到存储数量最大化的目标。
首先,我们先对n个程序进行sort排序,然后按照从小到大的顺序存入磁带中,直到程序总长超出磁带长度L为止
#include<iostream> #include<algorithm> using namespace std; int a[1005]; int main(){ int n,L; cin>>n>>L; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); int sum=0,count=0; for(int i=0;i<n;i++){ if(sum+a[i]<=L){ sum=sum+a[i]; count++; } } cout<<count<<endl; return 0; }
-
1.3 时间复杂度分析
sort排序算法时间复杂度是O(nlogn),而后面遍历一次数组的时间复杂度是O(n),且O(nlogn)>O(n)
从最坏情况下考虑,该算法的时间复杂度应为O(nlogn)
二、对贪心算法的理解
贪心算法通常会以自顶向下的方式来求解问题,并且做出的每个选择只是当前状态下的局部最优解,并非从整体最优的情况着手,所以有时得到的结果不是整体最优解。此外,贪心算法具有两个重要性质:贪心选择性质和最优子结构性质。
- 贪心选择性质:
所求问题的整体最优解可以通过一系列局部最优选择来实现,然后再去解做出这个选择后产生的相应的子问题。以自顶向下和迭代方式做出贪心选择,逐步化简。该特点也是贪心算法与动态规划的主要区别。
- 最优子结构性质:
一个问题的最优解包含子问题的最优解