程序存储问题
Posted jettle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序存储问题相关的知识,希望对你有一定的参考价值。
一.实践题目
设有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
二.问题描述
程序存储问题即为将n个程序放在长度固定的磁带上,这些程序在磁带上的长度不同,求磁带上最多可以放多少个程序
三.算法描述
贪心策略为每次都选择剩下的程序中长度最小的一个程序放进磁带中。
设程序P={1, 2, ...,n}按程序在磁带上的长度非递减排列,则程序1的长度最小。
贪心选择性质:
要确定问题是否具有贪心选择性质,则要证明每步所做的贪心选择最终导致问题的整体最优解,也即问题的整体最优解包含每一步的贪心选择。对于该问题,即证明该最优解中包含程序1。证明:
设A是最优解,且A中最先放入磁带的是程序k。
若k = 1,则最优解包含程序1,即A是一个以贪心选择开始的最优解。
若k>1(最优解不包含程序1),令B=A–{k}∪{1},因为程序 1 的长度小于程序 k 的长度,且 A中的程序个数与B相同,故B也是一个最优解,而B包含程序1,故总存在以贪心选择开始的最优存储方案。
最优子结构性质:
当一个问题的最优解包含子问题的最优解时,称此问题具有最优子结构性质。
若A是原问题的包含程序1的最优解,则A‘ = A - {1}是 P’ = {2, 3, ...,n}的一个最优解。 证明:
假设A‘ 不是P’ 的最优解,设B’ 是P‘ 的最优解,且 | B‘ | > | A‘ |, 则 B’ ∪ {1} 是 P的解,且| B‘ | + 1 > | A |, 这与A是最优解矛盾,故A‘ = A - {1}是 P’ = {2, 3, ...,n}的一个最优解。
实现方法为先将程序长度存入数组中,用sort 从小到大排序,然后将排好序的数组从第一个开始依次放入磁带中,直到达到磁带的长度。
代码:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int main(){ 5 int n, L; 6 cin >> n >> L; 7 int l[n]; 8 for(int i = 0; i < n; i++){ 9 cin >> l[i]; 10 } 11 sort(l, l + n); 12 int count = 0, sum = 0; 13 for(int i = 0; i < n; i++){ 14 sum += l[i]; 15 if(sum <= L){ 16 count++; 17 }else break; 18 } 19 cout << count; 20 }
四.算法时间和空间复杂度分析
该问题主要是对程序按长度进行从小到大的快排,故时间复杂度为O(nlog n);
辅助变量与问题规模无关,空间复杂度为O(1);
五.心得体会
本次上机实验让我更清楚地了解了贪心选择算法,即仅在当前状态下做出最好选择。用该算法解决问题时最重要的是贪心策略的确定,只要确定了贪心策略,每次根据贪心策略选择目前最优的解即可得到整体最优解。
以上是关于程序存储问题的主要内容,如果未能解决你的问题,请参考以下文章