算法第四章作业

4-1 程序存储问题 
 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
 
该题目要求装到磁带上的程序数目最多,那么只要选择长度小的程序先放到磁带上即可,即最短优先。
因为每添加一个程序之后,剩下的程序中还是优先选择最短的去添加,即做出在当前看来是做好的结果,所以它满足贪心选择的性质,可以使用贪心算法的思路去求解。
 
我的代码如下:
 

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int array[n];
for(int i = 0; i < n; i++)
{
cin >> array[i];
}
sort(array , array + n); //对各个程序的长度按照从大到小的顺序进行排序
int sum = 0;//sum表示已经添加到磁带上的总长度
int number = 0;//表示已经加入到磁带上的程序数目
for(int j = 0; j < n; j++)
{
sum += array[j];
if(sum <= m)
number++;
}
cout << number;
return 0;
}

对以上代码的时间复杂度分析:

代码的基本语句是:sum += array[j],循环的次数为n次,所以该贪心算法的时间复杂度是0(n)

对贪心算法的理解

贪心算法总是考虑当前情况下的最优选择,具有最优子结构性质。一般情况下,根据题目的求解,贪心策略可以分为最大优先或者最小优先两种。

运用贪心策略去求解问题时,最重要的是确定最优子结构性质。

 
 
 
posted @ 2021-11-11 20:20  二十三川  阅读(35)  评论(0编辑  收藏  举报