导航

算法第四章上机实践报告

Posted on 2019-11-19 21:29  郑丹儿  阅读(173)  评论(0编辑  收藏  举报

一、实践题目

程序存储问题

二、问题描述

设有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的使用、解题思路,代码的使用语法等时,翻阅参考书中资料做出代码实现;同时作为负责协助编程的同学,我与结对编程伙伴对所编写的程序进行讨论交流,实在不清楚的地方一起使用互联网的力量查找信息。在这整个过程中,理解了伙伴的编程思路也学到了新的编程知识,同时巩固了算法知识。