第四章上机实践报告
设有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
先贴出我的代码
#include <iostream> #include <algorithm> using namespace std; int main() { int num;//输入文件个数 cin >> num; int length;//输入磁带长度 cin >> length; int i,j,software[1001]; for(i = 1;i <= num;i++) cin >> software[i];//输入第i个程序的长度 sort(software + 1,software + num + 1); //升序排列程序长度 int status = 0;//判断磁带当前的状态 for(i = 1;i <= num;i++) { status = status + software[i]; if(status > length) { cout << i - 1; break; } } if(status <= length) cout << num; }
贪心策略:因为程序长度的输入并没有格式要求,所以只能先将程序长度升序输出,然后每次往磁带增加一个程序,通过status判断磁带当前的状态是否已满。若status > 磁带长度length,则拿出已装入的程序,输出i - 1。若status一直小于length,输出程序的个数就可以了。
时间复杂度:sort的时间复杂度是O(nlogn),因此这个算法的时间复杂度也是O(nlogn)。
心得:我这个算法有点太简单了...问题设置得再难一点就解决不了。需要学习更好的算法,运用好思维能力。