1. 题目分析
1.1 问题描述
程序存储问题
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是l,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
输出样例:
在这里给出相应的输出。例如:
5
1.2 算法描述
先把n个程序存储在a数组里面,再对a数组进行从小到大的排序。设置一个变量sum,初始化为0,通过循环将a数组里面排序好的程序长度加起来赋予sum,直至sum大于磁带的长度,最后输出循环i的值;若所有程序都可以存储进磁带,则通过判断i=n-1,从而输出i+1。
1.3 问题求解
#include<iostream>
using namespace std;
void swap(int a, int b){
int tmp=a;
a=b;
b=tmp;
}
int partition(int a[], int p, int r){
int i=p;
int j=r+1;
int x=a[p];
while(true){
while((a[++i]<x)&&(i<r));
while(a[--j]>x);
if(i>=j) break;
swap(a[i], a[j]);
}
a[p]=a[j];
a[j]=x;
return j;
}
void quicksort(int a[], int p, int r){
if(p<r){
int q = partition(a, p, r);
quicksort(a, p, q-1);
quicksort(a, q+1, r);
}
}
int main(){
int n, l;
cin >> n >> l;
int a[100000]={0};
for(int i=0; i<n; i++){
cin >> a[i];
}
quicksort(a, 0, n-1);
int sum=0;
for(int i=0; i<n; i++){
sum+=a[i];
if(sum>l){
cout << i;
break;
}
if(i==n-1){
cout << i+1;
}
}
return 0;
}
1.4 分析该算法的时间复杂度
本次使用了快速排序法,所以时间复杂度为O(nlogn)
2. 对贪心算法的理解
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解。