第四章贪心算法实验报告

《贪心算法实验报告》 计科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,此时能存下最多程序数。

心得与体会:贪心算法有的时候不能得到问题的最优解,但是其思想简单,代码思路清晰明了,能使用的时候不失为一种很好的方法。                                                                                                                                                                                                                                              

posted @ 2021-11-13 20:36  老八小汉堡  阅读(44)  评论(0编辑  收藏  举报