算法第四章上机实践报告

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

2、问题描述

求磁带最多可以存放多少个程序,尽量把长度短的程序放入磁带。

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 l=0,count=0;
for(int i=0;i<n;i++){
if((l+a[i])<=L){
l=l+a[i];
count++;
}
else {break;}
}

cout<<count;
}
 
贪心策略是先把长度短的程序放进磁带,再放长的。(把程序按从小到大的顺序排列,在从第一个开始按顺序一个个放入磁带)
反证法证明:假设最优解不包含长度最短的程序,把这个长度最短的程序和最优解中任何一个程序对调,得出的结果还是最优解,因此假设不成立,长度最短的程序应该在最优解中,贪心策略是正确的。
 

4、算法时间及空间复杂度分析

时间复杂度sort排序O(nlogn),贪心算法O(n)(只有一层for循环)

空间复杂度T(1)

5、心得体会

for(int i=0;i<n;i++){
if((l+a[i])<=L){
l=l+a[i];
count++;
}
else {break;}
}
的时候一开始没有=L,忽略了大小刚好等于的情况。还有排序数组的时候,一开始是自己写代码排序,没有用sort方法。
posted on 2019-11-18 19:18  JWZXXN  阅读(103)  评论(0编辑  收藏  举报