算法第四章作业

一、实践题目名称

  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)

 

二、对贪心算法的理解

  贪心算法通常会以自顶向下的方式来求解问题,并且做出的每个选择只是当前状态下的局部最优解,并非从整体最优的情况着手,所以有时得到的结果不是整体最优解。此外,贪心算法具有两个重要性质:贪心选择性质和最优子结构性质。

 

  • 贪心选择性质:

  所求问题的整体最优解可以通过一系列局部最优选择来实现,然后再去解做出这个选择后产生的相应的子问题。以自顶向下和迭代方式做出贪心选择,逐步化简。该特点也是贪心算法与动态规划的主要区别。

 

  • 最优子结构性质:

  一个问题的最优解包含子问题的最优解

posted @ 2021-11-12 16:01  Acemin  阅读(8)  评论(0编辑  收藏  举报