算法第四章上机实践报告
算法第四章上机实践报告
1.题目描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
输出样例:
在这里给出相应的输出。例如:
5
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n,L;
cin>>n>>L;
int l[100];
for (int i=0;i<n;i++){
cin>>l[i];
}
sort(l,l+n);
int sum=0;
int count=0;
for (int i=0;i<n;i++){
sum+=l[i];
if (sum>L) break;
count++;
}
cout<<count;
}
2.贪心策略
由小到大将程序的长度存放进磁带,直到磁带长度不够为止,此时可以存放的程序个数为最大值。
3.时间复杂度分析
代码中有两个for循环,时间复杂度都为O(n),由于使用了sort函数将数组升序排序,而sort函数的时间复杂度为O(n*logn),所以算法的时间复杂度为O(n*logn)。
4.对贪心算法的理解
对于许多最优化问题,使用动态规划法来求最优解有些杀鸡用牛刀了,这时若能使用贪心算法,便可以解决问题更加简单、更加高效。贪心算法的每一步都做出局部问题的最优选择,若局部问题的最优解能导致全局最优解,那么使用贪心算法可以简单高效的得到问题答案。
但是贪心算法有局限性,它并不适用于所有问题,使用贪心算法的问题需要满足贪心选择性质和最优子结构性质:即对于一个具体问题,必须证明每一步所作的贪心选择最终导致问题的整体最优解,且问题的最优解需要包含其子问题的最优解。
运用贪心算法解决问题时,最重要的是如何制定最为合适的贪心策略,以确保每一步都能求解到最优解,从而才能得到整个问题的最优解。
贪心算法不仅仅对解决算法题目时有着巨大的帮助,在实际生活中,为获得最大效益,人们也在不停地在使用着贪心策略,因此学好贪心算法对学习和生活都有着巨大的帮助,因此以后要更加认真的学习贪心算法,以丰富学识,便利生活。