【贪心篇(1)--例题分析】

文章介绍了贪心算法在解决删数问题、部分背包问题和活动安排问题中的应用。对于删数问题,关键在于按顺序删除递增序列的最后一个数,并处理特判情况。部分背包问题中,避免精度问题,采用交叉相乘替代除法。活动安排则按照结束时间排序,优先选择早结束的活动。
摘要由CSDN通过智能技术生成

目录

贪心的典型几类问题:

1、删数问题

2、部分背包问题

3、活动安排问题


1、删数问题

删数问题 - 洛谷https://www.luogu.com.cn/problem/P1106

注意:

  1. 贪心策略是每次删除递增序列的最后一个数
  2. 注意:当整个数列全递增的时候是删除最后一个数,而且要把长度符合以及本条件符合这两个条件一块判断,千万不要等删完坡点之后才判断是否走到了最后一位,因为有可能删除的时候是i指向倒数第二位,删完之后i就成最后一位了,会多删一次,所以洛谷上的测试2、6 WR了
  3. 两个特判:                                                                                                                            (1)一开始就特判需要删除的个数是不是比该数本身的位数还要大,那么直接输出0,并返回。                                                                                                                                  (2)删去前导零,eg:最后的结果是0089,那么应该删去前导0变为89。注意!当字符串仅一位数的时候就不需要再删除了。因为如果是零,那么就说明最后的结果是零,再删就空了;如果不是0,那更得留下来。
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string str;
    int k;
    cin>>str;
    cin>>k;
    if(k>=str.size()) {cout<<0;return 0;}//特判,当需要删除的数比字符串长度还要大时,输出0并退出
    while(k--)
    {
        int i=0;
        for(i;(i<str.size()-1)&&(str[i]<=str[i+1]);i++);//当走到最后一位或者当前值比后一个数大的时候就退出循环
        //cout<<i<<" "<<str[i]-'0'<<" ";//可自行测试用哦
        str.erase(i,1);
        //cout<<str<<" "<<endl;
    }
    while(str.size()>1&&str[0]=='0')//特判前导零
        str.erase(0,1);
   cout<<str;
}

2、部分背包问题

【深基12.例1】部分背包问题 - 洛谷https://www.luogu.com.cn/problem/P2240就强调一点!(卡了我好一会)

精度问题!像按照性价比进行排序,但是需要做除法,故可能会出现精度问题,本来两个数的性价比是不一样的,但是由于除法自动保留前六位的原因,会导致两个物品的性价比一样了,从而报错。所以不用除法,用交叉相乘代替,详见下代码

#include <bits/stdc++.h>
using namespace std;
struct JB{
    int m,v;
}jb[110];
bool cmp(JB a,JB b)
{
    return a.v*b.m>b.v*a.m;//当遇到除法的时候,谨防进精度问题,所以用交叉相乘把除法替换掉
}
int main()
{
    int n,bag;
    cin>>n>>bag;
    for(int i=0;i<n;i++)
    {
    cin>>jb[i].m>>jb[i].v;
    }
    sort(jb,jb+n,cmp);
    double ans=0;
    int i;
    for(i=0;i<n;i++)
    {
        if(bag<jb[i].m)break;
        ans+=jb[i].v,bag-=jb[i].m;
            //cout<<i<<" "<<jb[i].v<<" "<<bag<<endl;
    }
    if(i<n)ans+=jb[i].v*(bag*1.0/jb[i].m);
    //当该物品整个塞塞不下的时候,就按照背包的容量进行分割
    printf("%.2f",ans);
    return 0;
}

3、活动安排问题

4167. 活动安排 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/4170/贪心策略:按照活动结束时间进行从早到晚的排序,先安排早结束的活动。

小技巧:仅需一次遍历,每次记录上次结束的活动序号,目的是:判断当前扫描到的活动开始时间是不是在其后。

如果需要输出具体都安排了哪些活动,可在活动结构体中增加编号,同时增加全局变量visited[]记录哪些活动被访问过。

#include <bits/stdc++.h>
using namespace std;
struct active
{
    int from,to;
} hd[1005];
bool cmp(active a1,active a2)
{
    return a1.to<a2.to;
}
int main()
{
    int ans=0;
    int n;cin>>n;
    if(n!=0) ans=1;
    for(int i=0;i<n;i++)
    {
        cin>>hd[i].from>>hd[i].to;
    }
    sort(hd,hd+n,cmp);
    int preact=0;
    for(int i=1;i<n;i++)
    {
        if(hd[i].from>=hd[preact].to) ans++,preact=i;//只需要记录上一次活动结束的时间,将其于当前活动的开始时间进行比较,即可判断当前活动是不是能选
    }

    cout<<ans;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 0-1背包问题是一个经典的组合优化问题,其目标是在限定的背包容量下,选择一组物品放入背包中,使得背包中物品的总价值最大化。 贪心法是一种求解0-1背包问题的常用方法。其基本思想是每次选择当前最有利的物品放入背包中,直至背包容量不足或所有物品都放入背包为止。 具体实现贪心法0-1背包问题c的步骤如下: 1. 将所有物品按照单位重量的价值从大到小进行排序; 2. 初始化背包容量剩余空间为背包的总容量,初始化背包的总价值为0; 3. 依次遍历排序后的物品列表,对于每个物品: - 如果物品重量小于等于背包剩余空间,则将该物品放入背包中,背包剩余空间减少该物品重量,背包总价值增加该物品价值; - 如果物品重量大于背包剩余空间,则终止循环; 4. 返回背包中的物品总价值作为结果。 贪心法0-1背包问题c的时间复杂度为O(nlogn),其中n为物品数量,主要消耗时间的操作是对物品列表的排序。 ### 回答2: 贪心法是一种常用的求解最优问题的算法,包括0-1背包问题。在0-1背包问题中,我们有一系列物品,每个物品有重量和价值两个属性。我们需要选择一些物品放入背包,使得背包的总重量不超过背包的容量,同时能够使得背包中物品的总价值最大化。 贪心法的思想是每次选择当前最有利于解的选择,即每次选择重量最小但价值最高的物品放入背包。具体步骤如下: 1. 根据物品的重量和价值计算每个物品的价值密度(即单位重量下的价值)。 2. 将物品按照价值密度从高到低排序。 3. 依次选择物品放入背包,直到背包的重量达到限制或者所有物品都已经放入背包。 4. 计算放入背包的物品的总价值。 贪心法的优点是简单高效,时间复杂度较低。然而,贪心法并不保证能够得到最优解。在某些情况下,使用贪心法得到的结果可能与动态规划等其他算法得到的结果不一致。 对于0-1背包问题c,我们可以使用贪心法求解。具体步骤如下: 1. 计算每个物品的价值密度,即价值除以重量。 2. 按照价值密度从高到低对物品进行排序。 3. 依次选择物品放入背包,直到背包的重量达到限制或者所有物品都已经放入背包。 4. 最后计算放入背包的物品的总价值。 需要注意的是,虽然贪心法在某些情况下可能得到次优解,但在某些特殊的条件下,贪心法却可以得到最优解。因此,在实际应用中,根据具体问题的特点选择合适的算法是很重要的。 ### 回答3: 0-1背包问题是一个经典的动态规划问题,目标是在有限容量的背包中选择若干个物品放入背包,使得物品的总价值最大化。而贪心法无法解决0-1背包问题的最优解。 贪心法是一种贪婪的策略,每次选择当前看起来最好的解决方案。但在0-1背包问题中,贪心法会导致错误的结果。例如,假设有三个物品A、B和C,分别占据1、4和3的容量,价值分别为2、5和4,而背包的容量为4。若采用贪心法,首先选择B放入背包,然后剩余容量为0,无法再放入其他物品,总价值为5。但实际上,最优解应该是选择A和C,总价值为6。 因此,为了解决0-1背包问题,需要采用动态规划的方法。动态规划通过将问题划分为子问题,并保存子问题的解,最后通过组合子问题的解得到原问题的最优解。对于0-1背包问题,可以使用一个二维数组dp来保存子问题的解,其中dp[i][j]表示在前i个物品中,容量为j的背包可以获得的最大价值。通过迭代计算dp数组,最后得到dp[n][C]即为问题的最优解。 综上所述,贪心法无法解决0-1背包问题的最优解,需要采用动态规划的方法来求解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迎风809

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值