算法第四章上机实践报告

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. 对贪心算法的理解

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解。

 

posted on 2021-11-16 21:43  PurLinE  阅读(27)  评论(0编辑  收藏  举报