贪心算法理解及其模板

本文探讨了贪心算法在解决最优化问题中的应用,强调了排序的重要性以及处理约束条件的策略。通过一个背包问题的例子,展示了如何利用STL排序和循环选择实现局部最优解,从而找到全局最优解。文章适合对算法和数据结构感兴趣的读者,特别是希望提升解决实际问题能力的程序员。
摘要由CSDN通过智能技术生成

1做题目的:求最优解:最大,最小,最多,做少。。。。等最高级。

2最优解有约束的条件(区别于二分答案的答案就在区间之内的那种):背包只能装50公斤,区间调度两件事情之间不可以有叠加的情况。

3将最优解转化为局部最优解

刷过一些题目后不难得出,许多贪心算法的题目都涉及排序stl的使用,(这里从其原理上面来分析,因为他是想要找出“局部的一个最优解问题,而按照题意经过sort排序后的才有可能是最优解”)。——还有其他的要求,这里就要用到第二点里面总结的约束条件了。

 板子:

步骤一:用stl函数将数组进行排序(通常这类题数据都是用数组存储的)’

步骤二:用for循环的方式去选取加上if语句(当前约束的条件)选取当前的最优解。(sum,cnt.....)同时约束条件有变化的可能,比如区间问题就要写个temp变量

for(......)

{....

if(....)

{     ....        }

}

 背包问题

#include<bitd/stdc++.h> 
using namespace std;
struct node
{
	int w,v;
	double a;
};
struct node p[100];
bool cmp(node &m,node &n)//多定义为m,n 
{
	return m.a>n.a;
}
int main()
{
	int n,c;//背包余下的容量 
	cin>>n>>c;
	for(int i=0;i<n;i++)
	{
		cin>>p[i].w>>p[i].v;
		p[i].a=p[i].v/p[i].w;//输入的同时计算平均数 
	}
	sort(p,p+n,cmp);
	double sum=0;
	
	for(int i=0;i<n;i++)
	{
		if(c>p[i].w)       //选择的方法。 
		{
			sum+=p[i].v;  //计算相关的最优解
			              //有的时候还涉及新的条件变化“直接用temp”表示 
			c-=p[i].w;
		}
		else 
		sum+=p[i].a*c;
	}
	cout<<sum;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值