1.实践题目:程序存储问题
2.问题描述:
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
3.算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质):
贪心策略:每次贪心选择当前所有程序中长度最短的那一个程序(每次选择前需要升序排序,用当前磁带长度需减去选择程序的长度,直到磁带长度小于当前最小程序长度)
反证法证明贪心选择:设集合E={x1,x2,x3...xn}(集合已按升序排序,x1是最短长度的程序)。假设最优解A不包含x1,其中最短的程序长度为k,假若k = x1,则最优解中包含x1; 若A中k> x1,x1余A中其他的程序长度相容,故存在一个B = {A-{k}∪{x1}} ,从而B也是最优解,故可知最优解一定含有X1(长度最短的程序),得证。
反证法证明最优子结构性质:已知A是程序存储问题E={X1,X2,……,Xn}的满足贪心选择性质的最优解,X1=1,则A’=A-{X1}是E’={ X2,X3,……,Xn}的一个最优解。假设存在B’>A’,则有B=B’∪{1}>A’∪{1}=A,则B是E的最优解,与“A是E的最优解”矛盾,所以不存在这样的B和B’。因此,E的最优解A包含其子问题的子问题的最优解,得证。
4.算法时间及空间复杂度分析(要有分析过程):
时间复杂度:sort()排序为快排,因此时间复杂度为O(nlogn)
空间复杂度:仅需存储有限个数的变量结果,因此空间复杂度为O(1)
5.心得体会(对本次实践收获及疑惑进行总结):
贪心算法是一种局部最优的概念,虽然不的得到整体最优解,但结果是最优解的很好的近似解。贪心算法主要是要判断贪心最小还是最大,思想好理解,但真正打代码还会有些困难,实验上机课与搭档只完成了两题的代码。