1.实践题目
4-1 程序存储问题
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
2.问题描述
利用贪心算法:先将程序在磁带上的长度进行排序,优先选择程序磁带长度较小的,最多能存储的程序数与长度下标相关联。当程序正好能全部存储,返回程序总数。
#include<iostream> #include<algorithm> using namespace std; int l[100]; int most(int* a, int n, int L) { int sum = 0; for(int i = 0; i < n; i++) { sum += l[i]; if(sum > L) return i; if(i == n-1) return n; } } int main() { int n, L; cin >> n >> L; for(int i = 0; i < n; i++) cin >> l[i]; sort(l, l+n); cout << most(l, n, L); return 0; }
3.算法描述
int most(int* a, int n, int L) { int sum = 0; for(int i = 0; i < n; i++) { sum += l[i]; if(sum > L) return i; if(i == n-1) return n;//刚好能装下 } }
4.算法时间及空间复杂度分析(要有分析过程)
空间复杂度辅助存储l[n]:O(n)
时间复杂度循环遍历程序长度:O(n)
5.心得体会(对本次实践收获及疑惑进行总结)
贪心算法大多以某种形式进行排序,选择最优;局部最优解可能导致全局最优解