算法第四章作业

问题描述

有n个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li,1≤i≤n。对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

贪心策略

磁带的总长度是一定的,要想在磁带上存储更多的程序数,应该优先存储长度短的程序

问题分析

将n个程序存在放在磁带上的长度li保存在一个数组中,将此数组进行升序排序,然后遍历排序后的数组,判断每个程序能否存放到磁带上

算法描述

 // 存放在磁带上的长度
  for (int i = 0; i < n; i++)
  {
    cin >> li[i];
  }
  sort(li, li + n);
  // 记录存储的程序数
  int cnt = 0;
  for(int j = 0; j < n; j++) {
      if(li[j] <= l) {
          l -= li[j];
          cnt++;
      }
  }
  cout << cnt;

时间复杂度分析

sort()函数时间复杂度为O(nlogn)

对贪心算法的理解

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯。
使用贪心算法求解的问题应具备如下2个特征:

  1. 贪心选择性质
    一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质
  2. 最优子结构性质
    当一个问题的最优解包含其子问题的最优解时,则此问题具有最优子结构性质
posted on 2021-11-11 12:43  AIpoem  阅读(49)  评论(0编辑  收藏  举报