算法第四章作业

一、题目描述
4-1 程序存储问题 (40 分)
 

设有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
 
结尾无空行
 
二、算法描述
现将数组里的数据从小到大排序,使用贪心算法策略:在有限的磁带长度中存储更多数量的程序。
定义sum记录数据的和,定义count记录可存储的程序数量。若sum大于最大长度l,则跳出循环。
 
三、代码实现
 #include <bits/stdc++.h>
 using namespace std;
 int main()
 {
     int n,l;
     cin>>n>>l;
     int a[n];
     for(int i=0;i<n;i++)
     {
         cin>>a[i];
     }
     sort(a,a+n);
     int sum=0;
     int count=0;
     for(int i=0;i<n;i++)
     {
         sum+=a[i];
         if(sum<=l)
         {
             count++;
         }
         else break;
     }
     cout<<count<<endl;
     return 0;
 }

 

四、算法时间复杂度

遍历数组时间复杂度与数组长度有关,即为O(n);

sort排序时间复杂度为O(nlogn);

综上,本算法时间复杂度为O(nlogn);

 

五、对贪心算法的理解

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。

 对于解决贪心算法类问题基本按以下四个步骤进行:   1.建立数学模型来描述问题。

                                                                                       2.把求解的问题分成若干个子问题。 
                                                                                       3.对每一子问题求解,得到子问题的局部最优解。
                                                                                       4.把子问题的解局部最优解合成原来解问题的一个解
使用贪心算法的条件:
(1)最优子结构性质。最优解包含其子问题的最优解时,称具有最优子结构性质。
(2)贪心选择性质,整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。

 

posted @ 2021-11-14 22:58  Dtsuki  阅读(69)  评论(0编辑  收藏  举报