算法第四章上机实践报告

算法第四章上机实践报告

1.题目描述

 
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

 代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,L;
    cin>>n>>L;
    int l[100];
    for (int i=0;i<n;i++){
        cin>>l[i];
    }
    sort(l,l+n);
    int sum=0;
    int count=0;
    for (int i=0;i<n;i++){
        sum+=l[i];
        if (sum>L) break;
        count++;
    }
    cout<<count;
}

2.贪心策略

由小到大将程序的长度存放进磁带,直到磁带长度不够为止,此时可以存放的程序个数为最大值。

3.时间复杂度分析

代码中有两个for循环,时间复杂度都为O(n),由于使用了sort函数将数组升序排序,而sort函数的时间复杂度为O(n*logn),所以算法的时间复杂度为O(n*logn)。 

4.对贪心算法的理解

对于许多最优化问题,使用动态规划法来求最优解有些杀鸡用牛刀了,这时若能使用贪心算法,便可以解决问题更加简单、更加高效。贪心算法的每一步都做出局部问题的最优选择,若局部问题的最优解能导致全局最优解,那么使用贪心算法可以简单高效的得到问题答案。

但是贪心算法有局限性,它并不适用于所有问题,使用贪心算法的问题需要满足贪心选择性质最优子结构性质:即对于一个具体问题,必须证明每一步所作的贪心选择最终导致问题的整体最优解,且问题的最优解需要包含其子问题的最优解。

运用贪心算法解决问题时,最重要的是如何制定最为合适的贪心策略,以确保每一步都能求解到最优解,从而才能得到整个问题的最优解。

贪心算法不仅仅对解决算法题目时有着巨大的帮助,在实际生活中,为获得最大效益,人们也在不停地在使用着贪心策略,因此学好贪心算法对学习和生活都有着巨大的帮助,因此以后要更加认真的学习贪心算法,以丰富学识,便利生活。

posted @ 2021-11-16 20:46  Skker  阅读(15)  评论(0编辑  收藏  举报