算法第四章实践报告
4-1 程序存储问题
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
解题思路:
按照程序长度从小到大进行存放,sum记录当前存放程序总长度,count记录已存放程序数量,直至sum超过磁带容量
代码实现:
#include <bits/stdc++.h> using namespace std; int main(){ int n, L; int a[2000]; cin >> n >> L; for (int i=0; i<n ; i++){ cin >> a[i]; } sort(a,a+n); int sum = 0, count = 0; for (int i=0; i<n ; i++){ sum += a[i]; if (sum > L) break; count++; } cout << count; return 0; }
算法分析:
时间复杂度:sort函数时间复杂度为n*log2n,遍历数组为n,所以时间复杂度为n*log2n。
对贪心算法的理解:
贪心算法(Greedy Alogorithm)又叫登山算法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但是适用范围有限的策略。
贪心算法没有固定的框架,算法设计的关键是贪婪策略的选择。贪心策略要无后向性,也就是说某状态以后的过程不会影响以前的状态,至于当前状态有关。
贪心算法是对某些求解最优解问题的最简单、最迅速的技术。某些问题的最优解可以通过一系列的最优的选择即贪心选择来达到。但局部最优并不总能获得整体最优解,但通常能获得近似最优解。
在每一部贪心选择中,只考虑当前对自己最有利的选择,而不去考虑在后面看来这种选择是否合理。