第四章实验报告
1. 实践题目:
4-1 程序存储问题 (90 分)
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,i;
cin>>n>>l;
int a[n];
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //从小到大先排好序
int sum=0;
int max=0;
for(i=0;i<n;i++){ //容量不超过的情况下一个一个加进去
sum=sum+a[i];
if(sum<=l) max++;
}
cout<<max;
}
反证法:如果存在一个集合是最优解且集合内元素不是由长度最小的i个程序组成,去掉长度最小的程序后i-1个程序组成的子集为最优子结构,然而可找到其中一个长度更小的程序将子集内一个长度较大的元素置换,置换后的集合仍满足条件,表明原子集并不满足最优子结构性质。所以该贪心策略正确。
4. 算法时间及空间复杂度分析:
时间复杂度: sort排序O(nlogn),最差的情况是O(n),最好O(1),平均为O(n/2)
空间复杂度: O(n).
5. 心得体会:
第一题比较简单,写第二题的时候为了求n大小查了下之前学的strlen()函数,删除的时候出现各种错误,样例才能过。感觉就是思路想起来容易,会用到的方法少,实践难。