第四章上级实践报告

一、实践题目

  程序存储问题

 

二、问题描述

  有给定长度的n个程序要放在长度为L的磁盘上,计算磁盘上最多能装多少个程序

 

三、算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)

  

  设程序集合E={1,2,3,... ,n }以按程序大小的非减顺序排序,则程序1是其中最小的  

  贪心策略:每次选择当前长度最短的程序放入磁盘

  贪心选择与最优子结构性质:首先必有程序1,不然设A∈E是最优解,且A中最小的程序为k。若k=1,则最优解包含1。若k>1,则活动1必与A中除k以外的程序相容。令B=A-{k}∪{1},则B也是个最优解

               进一步,若A是原问题的包含程序1的最优解,则A‘=A-{1}是程序集合E'={i∈E:si>f1}的一个最优解

               不然,设B'是E'的解且|B'|>|A'|,则B'∪{1}是E的解且|B'|+1>|A|。此与A是最优解矛盾。所以必有最短的程序1。

  

 

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

  代码如下:

  

#include<iostream>
#include<algorithm>
using namespace std;
int n,l;
int a[100000];

int main(){
    cin>>n>>l;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n-1);
    int ans=0;
    
    for(int i=0;i<n;i++){
        if(l-a[i]>=0){
            l=l-a[i];
            ans++;
        }
    } 
    cout<<ans;
    return 0;
}
View Code

  时间复杂度:进行了一次快排,还有一次对数组的遍历,所以时间复杂度为O(nlogn)

  空间复杂度:只开了一个变量用以记录剩余空间,则空间复杂度为O(1)

 

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

  这道题比较简单,只要想好贪心策略,证明其正确性,基本就可以迎刃而解了。

posted @ 2019-11-18 19:15  三户  阅读(148)  评论(0编辑  收藏  举报