一、.4-1 程序存储问题 (90 分)
设有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
二、问题描述
这个问题要求我们找到一个存储方案,该方案可以存储的程序数最多,并且磁带的长度L是固定的,意味着存储程序的长度总和不能超过L。
三、算法描述
1 sort(l, l + n); 2 3 int temp = 0; 4 5 for (int i = 0; i < n; i++) 6 { 7 count += l[i]; 8 if (count <= length) 9 { 10 temp++; 11 } 12 } 13 cout << temp;
通过sort排序将程序按长度从小到大排好序,每次存入剩下程序中长度最小的程序(贪心策略),直至不能再存入程序可以得到存入程序数最多方案。
设E={2,3,8,13,20,80}为所给定的程序集合,E中按程序长度非减序排序,故程序2具有最小长度2。设A ⊆E是所给程序安排的一个最优解,且A中程序也按程序长度非减序排列,A中第一个程序是程序K。若K=2,则A就是一个以贪心选择开始的最优解。若K!=2,则设B=A-{K}∪{2}。由于f2≤fk,且A中程序相容,故B中程序也相容。又由于A和B程序个数相同,且A是最优的,故B也是最优的。
进一步,在做了贪心选择,即选择了程序2后。若A是原问题的最优解,则A’=A-{2}是程序安排问题E{i∈E:si≥f2}的最优解。事实上,如果能找到E’的一个解B’,包含比A’更多的程序,则将程序2加入到B’中将产生E的一个解B,它包含比A更多的活动。这与A的最优性矛盾。
四、算法时间及空间复杂度分析
主要是sort算法O(nlogn)(采用的是快速排序)和一个for循环O(n),因此时间复杂度为O(n)。
空间复杂度为O(1),没有另外的数组等。
五、心得体会
实践第二题属实是难,一开始想到了用char数组存数字然后用sort排序根据第一题的贪心策略解题,发现投机取巧果然是没有用的。然后想到了从左扫描至右,递增不动,递减开始把第一个数删掉将后面数前移,直至删掉k个数。最后提交时是运行超时,时间复杂度是O(n3)属实难顶。