算法第四章上机实践报告
Posted jumaodangdawang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第四章上机实践报告相关的知识,希望对你有一定的参考价值。
算法第四章上机实践报告
程序储存问题
- 实践题目
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
- 问题描述
程序储存问题可以用贪心算法求解。采用存放长度最短者优先存储的贪心选择策略,可以产生程序储存问题的最优解。
- 算法描述
#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、待储存程序为{2,3,4,...,n}时相应程序储存问题的最优解。也就是说,程序储存问题具有最优子结构性质。
由程序储存问题的贪心选择性质和最优子结构性质,容易证明算法的正确性。
而实际上,本问题并不需要列举出储存了哪些程序,只需要得出储存程序个数,所以将数组x[i]用count来代替。
- 时间/空间复杂度
算法的主要计算量在于将要储存的程序依照长度从短到长进行排序,所以算法所需计算时间为O(nlogn)。
空间复杂度同上。
- 心得体会
本次算法上机实践,对于贪心算法的思想以及编程结构更加了解; 以及发现算法并不是固定的,可以通过思维点的转变进行简化。
算法第四章上机实践报告
程序储存问题
- 实践题目
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
- 问题描述
程序储存问题可以用贪心算法求解。采用存放长度最短者优先存储的贪心选择策略,可以产生程序储存问题的最优解。
- 算法描述
#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、待储存程序为{2,3,4,...,n}时相应程序储存问题的最优解。也就是说,程序储存问题具有最优子结构性质。
由程序储存问题的贪心选择性质和最优子结构性质,容易证明算法的正确性。
而实际上,本问题并不需要列举出储存了哪些程序,只需要得出储存程序个数,所以将数组x[i]用count来代替。
- 时间/空间复杂度
算法的主要计算量在于将要储存的程序依照长度从短到长进行排序,所以算法所需计算时间为O(nlogn)。
空间复杂度同上。
- 心得体会
本次算法上机实践,对于贪心算法的思想以及编程结构更加了解; 以及发现算法并不是固定的,可以通过思维点的转变进行简化。
以上是关于算法第四章上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章