c++贪心算法

核心思想:

在对问题求解时,总是做出再当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是某种意义上的局部最优解。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

主要流程:

1.建立数学模型来描述问题

2.把求解的问题分成若干个子问题

3.对每一子问题求解,得到子问题的局部最优解

4.把子问题的解局部最优解合成原来解问题的一个解

选择条件:

用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此一定要注意判断问题是否适合采用贪心算法策略,找到解是否一定是问题的最优解。

例题:

书架(点击查看题目)

分析:这道题是一个典型的贪心算法。要求奶牛数量尽量少,因此需找出最高的奶牛,直至累计奶牛高度大于或等于书架高度

写法:先将奶牛高度降序排序,然后累加,直至高度大于或等于书架高度。

#include<bits/stdc++.h>
using namespace std;
int n,b,h[20005],res,x; 
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	cin>>n>>b;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
	}
	sort(h+1,h+n+1,cmp);
	for(int i=1;i<=n;i++) 
	{
		res++;
		x+=h[i];
		if(x>=b)
		{
			cout<<res;
			break;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值