《算法设计与分析》--第四章上机实践报告

实践题目:4-1程序存储问题

问题描述:

设有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

算法描述

    先对程序进行从小到大排序,然后依次放入磁带直到放不下。

    证明:假设最优解有{x2,x4},而x1 < x2,那么把x2换成x1组成的解{x1,p4},放入的程序数不变而且也满足题意,所以{p1,p4}也是一组最优解,该算法即贪心算法正确。

    以下是ac代码

  

#include <iostream>    
#include <algorithm>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;
    
    int* a = new int[n];
    
    for(int i = 0; i < n; i++)
        cin >> a[i];
        
    sort(a, a + n);
    int sum = 0;
    int flag = 0;
    for(int i = 0; i < n; i++){
        sum = sum + a[i];
        if(sum <= m) flag++;
        else break;
    }
    cout << flag;
    return 0;
}
View Code

算法时间及空间复杂度分析

    时间复杂度:排序O(nlogn),判断程序能否放入磁带O(n),所以时间复杂度为O(nlogn)

    空间复杂度:开了一个变量记录已放程序的总空间,空间复杂度为O(1)。

心得体会

  我觉得第一题的并不是很难,就是启发式算法想一下就ok,不过要注意细节上的问题,如数组越界,永真循环等问题。还要自己的思维锻炼也很重要,贪心算法也需要自己证明出来的。

  多打代码

 

认清现实,放弃幻想。 细节决定成败,心态放好,认真学习与工作。
原文地址:https://www.cnblogs.com/jyf2018/p/11877704.html