问题描述
有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个特征:
- 贪心选择性质
一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质 - 最优子结构性质
当一个问题的最优解包含其子问题的最优解时,则此问题具有最优子结构性质