算法第四章作业-贪心算法

程序存储问题

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

输入格式:

第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。

输出格式:

输出最多可以存储的程序数。

输入样例:

在这里给出一组输入。例如:

6 50 
2 3 13 8 80 20

输出样例:

在这里给出相应的输出。例如:

5

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,l;
    cin>>n>>l;
    int *a = new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    int sum = 0;
    int count = 0;
    for(int i=0;i<n;i++)
    {
        if(a[i]+sum<=l)
        {
            sum+=a[i];
            count++;
        }
        else 
        {
            continue;
        }
    }
    cout<<count;
}

问题分析: 

如果我们需要在给定的长度中尽可能地存储更多的程序,那么我们肯定是一点一点地把程序从小到大放进去才能放得更多,毕竟,无论你有多小,也算是一个程序嘛。所以我们需要先进行排序,再用一个计数器记录当前贪心算法放入的程序个数即可。

反证法:如果首先放入一个第二小的程序(所有程序需要判断是否大于这个给定长度),那么有可能出现情况有:

1.这程序直接可能放不下(我们已经通过判断筛选),所以至少你得把第一小的放进去。

2.这程序太大了,导致只能放一个,那和我直接选择第一小是没有区别的,都是只能放一个。

3.放了这个程序后,继续依次放入比他大的程序(排序),磁带还有剩余空间,直到磁带剩余空间小于这当前这个不能被放进磁带,所以只能再次选择第一小的程序以满足要求。

对贪心算法的理解:

首次接触是去年某位大神出的关于原神世界里货币和货物的题目。其实用生活举个例子就很简单,我要给红包,我最多给小朋友100元,为了这个红包鼓一点,那我肯定是1块钱1块钱地给,再给5块,再给20块。

贪心算法涉及到给定一个最终的价值限制和一个物品的价值(也有可能是别的度量单位),都是通过先排序后存放计数的方法解决问题即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值