学习记录2.贪心

定义:通过逐步求局部最优(当前状态的最好选择)来导出全局最优(ps:允许的条件下贪心最快)

适用条件:具有最优子结构(一个问题的最优解包含其子问题的最优解,一个问题的最优解包含其子问题的最优解

                  具有贪心选择性质(求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。)

流程

Greedy(A)
{
  S={ };           //初始解集合为空集
  while (not solution(S))  //集合S没有构成问题的一个解
  {
    x = select(A);     //在候选集合A中做贪心选择
    if feasible(S, x)    //判断集合S中加入x后的解是否可行
      S = S+{x};
      A = A-{x};
  }
  return S;
}

(1候选集合A:为了构造问题的解决方案,有一个候选集合A作为问题的可能解,即问题的最终解均取自于候选集合A。

(2解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成满足问题的完整解。

(3解决函数solution:检查解集合S是否构成问题的完整解。

(4选择函数select:即贪心策略,这是贪心法的关键,它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。

(5可行函数feasible:检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。

例子:

//Q1.删数问题
#include<iostream>
#include<string>
using namespace std;
main()
{
    int k;
    string str;
    cin>>str>>k;
    if(k>=str.size()) str.erase();
    while(k)
    {
        int i;
        for(i=0;i<=(str.size()-1)&&str[i]<=str[i+1];i++)
            str.erase(i,1);
        k--;//寻找最近下降点并删除
    }
    if(str.size()>1 && str[0]=='0') str.erase(0,1);//删除前导0
    cout<<str<<endl;

背包问题(csdn上一篇很全的总结:https://blog.youkuaiyun.com/ling_du/article/details/41594767

//Q2.背包问题(可拆分)
#include<iostream>
#include<algorithm>
using namespace std;
struct bag{
	int w;			//物品的重量
	int v;			//物品的价值
	double c;		//性价比
}a[1001];			//存放物品的数组
bool cmp(bag a, bag b){
	return a.c >= b.c;
}//排序因子(按性价比降序)
//形参n是物品的数量,M是背包的容量,数组a是按物品的性价比降序排序
double knapsack(int n,bag a[], double M)//注意这里的bag a[]是传址调用
{
    double Mleft=M;//背包的剩余容量
    int i=0;
    double b=0;//获得的价值
    //当背包还能完全装入物品i
    while(i<n && a[i].w<Mleft)
    {
        Mleft-=a[i].w;
        b+=a[i].v;
        i++;
    }//装满背包的剩余空间
    if (i<n) b += 1.0*a[i].v*Mleft/a[i].w;
    return b;
}
main()
{
    int n,M;
    cin>>n>>M;
    for(int i=0;i<n;i++) cin>>a[i].w>>a[i].v;
    stable_sort(a,a+n,cmp);
    double res;
    res=knapsack(n,&a[1001],M);//注意这里的bag a[]是传址调用
    cout<<res;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值