算法第4章实践报告

算法第4章实践报告


实践报告任选一题进行分析。内容包括:

1.实践题目

7-3 程序存储问题 (90 分)

2.问题描述

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

 

3.算法描述

贪心算法的思想就是将尽可能多的程序放入磁带中,其实问题实质就是将程序的大小按照非降序排序后,首先将小的放进磁带中,直到磁带放不下了,就停止运行。

具体贪心算法的实现部分如下:

 sort(a,a+n);

int sum = 0;

int i= 0;

while(sum<=l&&i<n){

   sum+= a[i];

   if(sum<=l&&i==(n-1)) cout<<n;

   i++;

   if(sum>l)      cout<<i-1;

    }

return 0;  

}

 

4.算法时间及空间复杂度分析(要有分析过程)

时间复杂度:O(n)

根据代码中的while循环i从0到n-1:

int i=0;

while(sum<=l&&i<n){

    sum+= a[i];

    if(sum<=l&&i==(n-1)) cout<<n;

    i++;

    if(sum>l) cout<<i-1;

    }

return 0;  

}

空间复杂度:O(n)

本题的空间即为存储程序量的数组,所以无需额外申请多余的空间。

5.心得体会(对本次实践收获及疑惑进行总结)

我的代码用的是一个while循环,个人觉得比起for循环来有些复杂,当当是这一个if的判断条件【if(sum<=l&&i==(n-1))  cout<<n;i++;】就让我和小伙伴讨论弄了挺长时间,因为之前一直没有加上sum<=l这个条件,果然还是细节决定成败。

posted @ 2018-12-02 17:36  zmkkkk  阅读(147)  评论(0编辑  收藏  举报