20201003008计科2001陆启康算法第四次上机实验报告之贪心算法
实践题目名称
4-1 程序存储问题 (40 分)
问题描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
算法描述(贪心选择性质)
题目要求在有限的空间内尽可能多的装入程序,那么肯定是将大小最小的程序优先装入,使得装入的程序最多。那么该算法在进行相关输入后。首先将表示各程序大小的数组进行由小到大的排序,再按顺序将程序装入空间中,直至不能装入为止,记录装入的程序的个数并输出。
具体代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,L;
cin>>n>>L;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int count=0;
int sum=0;
for(int i=0;i<n;i++){
if(a[i]+sum>L){
break;
}
else{
count++;
sum+=a[i];
}
}
cout<<count;
}
算法时间及空间复杂度分析
时间:
O(nlogn)(快排平均时间复杂度)
空间:O(n)
对贪心算法的理解
贪心的每一步都是当前的最优解,所有步骤完成后就是总的最优解。
它有两个重要性质:贪心选择性质和最优子结构性质。
贪心选择性质:指问题的最优解可以通过一系列局部最优解的选择得到。
最优子结构性质:指问题的最优解包含其子问题的最优解。
心得体会
贪心算法非常常见且实用。