第四章贪心算法实验报告
《贪心算法实验报告》 计科2001 陈梓聪 20201003024
贪心算法的思想:通过第四章学习了贪心算法,我们知道,贪心算法总是做出在当下看来最好的选择,通过每个最优的选择来得出原问题的最优解。
贪心算法的使用条件:贪心算法有的时候并不能得出最优解,只有在满足一下两个条件的时候才能使用:1.贪心性质:整体的最优解可通过一系列局部最优解达到,并且每次的选择可以依赖以前做出的选择,但不能依赖于以后的选择。2.最优子结构: 问题整体的最优解包括子问题的最优解。
贪心算法的局限性:贪心算法有他的局限性,有的时候我们选择局部的最优解,但是它对与全局并非最优解,就比如硬币找零问题。但是我们依然可以用我们上一章所学的动态规划思想来解决。
贪心算法的分析过程:首先,我们需要确定我们的贪心策略,只有正确的贪心策略才能得出我们的结论。下面是我们的实验题。
4-1程序储存问题:
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:输出最多可以存储的程序数。
输入:6 50 输出: 5
2 3 13 8 80 20
#include <iostream> #include <algorithm> using namespace std; int main() { int n, l, res; cin >> n >> l; int *a = new int [n]; for(int i = 0; i < n; i ++) { cin >> a[i]; } sort(a, a + n); for(int i = 0; i < n; i ++) { l -= a[i]; if(l < 0) { res = i; break; } } cout << res; return 0; }
贪心策略:我的贪心策略是将还未存入磁带中最小的程序放入磁带,直到放入一个程序后,再放入下一个程序时程序的总长度>L,此时能存下最多程序数。
心得与体会:贪心算法有的时候不能得到问题的最优解,但是其思想简单,代码思路清晰明了,能使用的时候不失为一种很好的方法。