一、实践题目
程序存储问题
二、问题描述
有给定长度的n个程序要放在长度为L的磁盘上,计算磁盘上最多能装多少个程序
三、算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)
设程序集合E={1,2,3,... ,n }以按程序大小的非减顺序排序,则程序1是其中最小的
贪心策略:每次选择当前长度最短的程序放入磁盘
贪心选择与最优子结构性质:首先必有程序1,不然设A∈E是最优解,且A中最小的程序为k。若k=1,则最优解包含1。若k>1,则活动1必与A中除k以外的程序相容。令B=A-{k}∪{1},则B也是个最优解
进一步,若A是原问题的包含程序1的最优解,则A‘=A-{1}是程序集合E'={i∈E:si>f1}的一个最优解
不然,设B'是E'的解且|B'|>|A'|,则B'∪{1}是E的解且|B'|+1>|A|。此与A是最优解矛盾。所以必有最短的程序1。
四、算法时间及空间复杂度分析(要有分析过程)
代码如下:

#include<iostream> #include<algorithm> using namespace std; int n,l; int a[100000]; int main(){ cin>>n>>l; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n-1); int ans=0; for(int i=0;i<n;i++){ if(l-a[i]>=0){ l=l-a[i]; ans++; } } cout<<ans; return 0; }
时间复杂度:进行了一次快排,还有一次对数组的遍历,所以时间复杂度为O(nlogn)
空间复杂度:只开了一个变量用以记录剩余空间,则空间复杂度为O(1)
五、心得体会(对本次实践收获及疑惑进行总结)
这道题比较简单,只要想好贪心策略,证明其正确性,基本就可以迎刃而解了。