Russell_0221

导航

算法实践报告第四章

1.实践题目名称

   4-1 程序存储问题

 

2.问题描述

   设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。程序存储问题要求确定这n 个程序  在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

 

3.算法描述

#include <iostream>
#include <algorithm>
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++){
        if(sum<L){
            if(a[i]<=L-sum){
                sum += a[i];
                count++;
            }
        }
    }
    cout<<count;
    return 0;
}

   要在规定长度的宽带上放尽可能多的程序,根据贪心策略,则需要先将长度较小的程序都放进去。

   只要放进去的长度较小的程序足够多,则能够取到最优解。

   设sum为当前宽带中存入的程序长度,count为存入的程序数。

   在运用sort排序后,在for循环中按顺序存入长度较小的程序,并同时更新sum和count。

 

4.算法时间复杂度分析

   因为主要计算量在于将程序长度从小到大的排序,所以算法所需的计算时间为O(nlogn)。

 

5.心得体会

   贪心策略是通过一系列局部最优解的选择来获得整体的最优解,在做题时我们应先确定其是否具有贪心性质,再针对性根据问题来做出贪心选择即可。

 

posted on 2021-11-11 15:59  Russell_0221  阅读(36)  评论(0)    收藏  举报