一、实践题目
程序存储问题
二、问题描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
三、算法描述
本题中,我和编程伙伴的解题思路是先用sort函数将给出的程序按长度从小到大的顺序进行排列。为使给定长度容量L装入尽可能多的程序数,我们从排好序后的第一个即最小长度程序开始装入,当剩余容量l小于某程序a长度时即停止,结束。
反证:假如当扫描到程序a则装入停止后,后面还有未装入程序可以存放,即还存在某程序b长度<剩余容量l,则应有 程序b长度< 剩余容量l < 程序a长度 ,则 程序b长度< 程序a长度,但由于sort函数排列后已按长度从小到大排序,即必然存在排在前面的程序a长度 < 后面的程序b长度,不符合,故原思路正确。
代码如下:
# include <iostream>
# include <algorithm>
using namespace std;
int main(){
int n, L, i, count;
count = 0;
cin >> n >> L;
int a[n];
for ( i=0; i<n; i++){
cin >> a[i];
}
sort(a,a + n);
for (i=0; i<n; i++){
if(a[i] <= L){
L = L - a[i];
count++;
}
}
cout << count;
return 0;
}
四、算法时间及空间复杂度分析
最坏情况下时间复杂度为O(n),因为进行一个循环体,循环中要进行相应的n次比较,则问题规模为循环次数即n。
空间复杂度为O(n),因为空间复杂度是计算算法的辅助空间单元的个数,即为算法执行时创建的变量个数,此算法创造的辅助变量为数组里的n个,故空间复杂度为O(n)。
五、心得体会
本次上机实践中,遇到问题例如函数sort的使用、解题思路,代码的使用语法等时,翻阅参考书中资料做出代码实现;同时作为负责协助编程的同学,我与结对编程伙伴对所编写的程序进行讨论交流,实在不清楚的地方一起使用互联网的力量查找信息。在这整个过程中,理解了伙伴的编程思路也学到了新的编程知识,同时巩固了算法知识。