第四章上机实践报告
设有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)。
心得:我这个算法有点太简单了...问题设置得再难一点就解决不了。需要学习更好的算法,运用好思维能力。
浙公网安备 33010602011771号