实践题目:4-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
算法描述
先对程序进行从小到大排序,然后依次放入磁带直到放不下。
证明:假设最优解有{x2,x4},而x1 < x2,那么把x2换成x1组成的解{x1,p4},放入的程序数不变而且也满足题意,所以{p1,p4}也是一组最优解,该算法即贪心算法正确。
以下是ac代码
#include <iostream> #include <algorithm> using namespace std; int main(){ int n, m; cin >> n >> m; int* a = new int[n]; for(int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); int sum = 0; int flag = 0; for(int i = 0; i < n; i++){ sum = sum + a[i]; if(sum <= m) flag++; else break; } cout << flag; return 0; }
算法时间及空间复杂度分析
时间复杂度:排序O(nlogn),判断程序能否放入磁带O(n),所以时间复杂度为O(nlogn)
空间复杂度:开了一个变量记录已放程序的总空间,空间复杂度为O(1)。
心得体会
我觉得第一题的并不是很难,就是启发式算法想一下就ok,不过要注意细节上的问题,如数组越界,永真循环等问题。还要自己的思维锻炼也很重要,贪心算法也需要自己证明出来的。
多打代码。