算法第四章上机实践报告

Posted jumaodangdawang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第四章上机实践报告相关的知识,希望对你有一定的参考价值。

算法第四章上机实践报告

程序储存问题

  1. 实践题目

设有n 个程序{1,2,, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li1in。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

 

  1. 问题描述

程序储存问题可以用贪心算法求解。采用存放长度最短者优先存储的贪心选择策略,可以产生程序储存问题的最优解。

 

  1. 算法描述

#include <iostream>

#include <algorithm>

using namespace std;

 

int w[100000000];

 

int storage(int w[], int c, int n) {

    sort(w, w + n);

    int count = 0;

    for (int i = 0; i < n && w[i] <= c; i++) {

        

        c -= w[i];

        count++;

    }

    return count;

}

 

int main()

{

    int n;

    int c;

    cin >> n >> c;

    for (int i = 0; i < n; i++) {

        cin >> w[i];

    }

cout << storage( w, c, n);

 

    return 0;

}

 

贪心选择性质:

程序已经按照长度由小到大排序,假设有一个数组x[i](0<i<=n)用于存放程序储存问题的解,而(x1, x2, ..., xn)是程序储存问题的一个最优解,设k = min{i|xi = 1},如果给定的程序储存问题有解,则1<=k<=n

(1) k = 1时,(x1, x2, ... , xn)是一个满足贪心选择性质的最优解。

(2) k > 1时,取y1 = 1, yk = 0, yi = xi, 1 < i <=n, i != k,则

        wiyi(求和) = w1 - wk + wixi(求和) <= wixi(求和) <= c

因此,(y1, y2, ... , yn)是所给程序储存问题的可行解

另一方面,由yi(求和)= xi(求和)可知,(y1, y2, ... ,yn)是满足贪心选择性质的最优解,所以,程序储存问题具有贪心选择性质。

最优子结构性质

设(x1, x2, ... , xn)是程序储存问题的满足贪心选择性质的最优解,则x1 = 1, (x2, x3, ... , xn)是磁带储存长度为c - wi、待储存程序为{234...n}时相应程序储存问题的最优解。也就是说,程序储存问题具有最优子结构性质。

由程序储存问题的贪心选择性质和最优子结构性质,容易证明算法的正确性。

而实际上,本问题并不需要列举出储存了哪些程序,只需要得出储存程序个数,所以将数组x[i]count来代替。

 

  1. 时间/空间复杂度

算法的主要计算量在于将要储存的程序依照长度从短到长进行排序,所以算法所需计算时间为Onlogn)。

空间复杂度同上。

 

  1. 心得体会

本次算法上机实践,对于贪心算法的思想以及编程结构更加了解; 以及发现算法并不是固定的,可以通过思维点的转变进行简化。

算法第四章上机实践报告

程序储存问题

  1. 实践题目

设有n 个程序{1,2,, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li1in。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

 

  1. 问题描述

程序储存问题可以用贪心算法求解。采用存放长度最短者优先存储的贪心选择策略,可以产生程序储存问题的最优解。

 

  1. 算法描述

#include <iostream>

#include <algorithm>

using namespace std;

 

int w[100000000];

 

int storage(int w[], int c, int n) {

    sort(w, w + n);

    int count = 0;

    for (int i = 0; i < n && w[i] <= c; i++) {

        

        c -= w[i];

        count++;

    }

    return count;

}

 

int main()

{

    int n;

    int c;

    cin >> n >> c;

    for (int i = 0; i < n; i++) {

        cin >> w[i];

    }

cout << storage( w, c, n);

 

    return 0;

}

 

贪心选择性质:

程序已经按照长度由小到大排序,假设有一个数组x[i](0<i<=n)用于存放程序储存问题的解,而(x1, x2, ..., xn)是程序储存问题的一个最优解,设k = min{i|xi = 1},如果给定的程序储存问题有解,则1<=k<=n

(1) k = 1时,(x1, x2, ... , xn)是一个满足贪心选择性质的最优解。

(2) k > 1时,取y1 = 1, yk = 0, yi = xi, 1 < i <=n, i != k,则

        wiyi(求和) = w1 - wk + wixi(求和) <= wixi(求和) <= c

因此,(y1, y2, ... , yn)是所给程序储存问题的可行解

另一方面,由yi(求和)= xi(求和)可知,(y1, y2, ... ,yn)是满足贪心选择性质的最优解,所以,程序储存问题具有贪心选择性质。

最优子结构性质

设(x1, x2, ... , xn)是程序储存问题的满足贪心选择性质的最优解,则x1 = 1, (x2, x3, ... , xn)是磁带储存长度为c - wi、待储存程序为{234...n}时相应程序储存问题的最优解。也就是说,程序储存问题具有最优子结构性质。

由程序储存问题的贪心选择性质和最优子结构性质,容易证明算法的正确性。

而实际上,本问题并不需要列举出储存了哪些程序,只需要得出储存程序个数,所以将数组x[i]count来代替。

 

  1. 时间/空间复杂度

算法的主要计算量在于将要储存的程序依照长度从短到长进行排序,所以算法所需计算时间为Onlogn)。

空间复杂度同上。

 

  1. 心得体会

本次算法上机实践,对于贪心算法的思想以及编程结构更加了解; 以及发现算法并不是固定的,可以通过思维点的转变进行简化。

以上是关于算法第四章上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章

算法第四章上机实践报告

算法第四章上机实践报告

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告

第四章算法上机实践报告

算法第四章上机实践报告