一.实践题目
设有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个程序放在长度固定的磁带上,这些程序在磁带上的长度不同,求磁带上最多可以放多少个程序
三.算法描述
1.贪心策略
sort(a,a+n); for(int i=0;i<n;i++){ sum+=a[i]; if(sum<=l){ count++; } }
贪心策略为每次都选择剩下的程序中长度最小的一个程序放进磁带中。
设程序P={1, 2, ...,n}按程序在磁带上的长度非递减排列,则程序1的长度最小。
2.判断最大
将从小到大的排好序的程序依次加入磁带,如果超出总长度就停止。用一个变量count来记录已用长度,用p来记录加入的程序数。
3.具体代码
#include<iostream> #include<algorithm> using namespace std; int main(){ int n,l,sum=0,count=0; cin>>n>>l; int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(int i=0;i<n;i++){ sum+=a[i]; if(sum<=l){ count++; } } cout<<count; return 0; }
四.算法时间和空间复杂度分析
该问题主要是对程序按长度进行从小到大的排序,故时间复杂度为O(nlog n);
辅助变量与问题规模无关,空间复杂度为O(1);
五.体会
本次上机实验让我更清楚地了解了贪心选择算法,即在每一次计算中找出最优解。在进行的每一次贪心算法中最重要的
是贪心策略的选择,然后的每一次计算通过贪心策略得到最优解,从而得到整体最优解。在这次结对编程中,队友间的
一起思考很重要。