7.5贪心(笔记(来得及就放例题))

本文介绍了贪心算法的基本概念,强调它是一种解题思想而非算法。通过四个例题展示了贪心策略在不同问题中的应用,包括找零钱、线段排序等,并通过反例说明贪心算法并不总是能得到最优解,例如在0/1背包问题中。正确使用贪心需结合证明其正确性,如反证法。同时,提到了动态规划作为解决某些问题的替代策略。
摘要由CSDN通过智能技术生成

今天发现了一个新大陆——CSDN主页,文章蛮好看的(没错这就是我水了20分钟CSDN的理由)

咳咳进入正题

贪心的概念:贪心是一种解题策略,也是一种解题思想,在每次决策(选择)时采取当前意义下最优策略的算法。
利用贪心策略解题,需要解决两个问题:
          1.该题是否适合于用贪心策略求解

          2.如何选择贪心标准,以得到问题的最优/较优解 

所以贪心并不是一种算法而是一种思想(废话)

例题一:在50元和100元面值的人民币出现之前,人民币仅由10元、5元、2元、1元、5角、2角、1角和5分、2分、1分面值的钱币组成。现给定一个10000元以内,精确到1分的人民币数值,请你用最少的钱币张数,找出相应的钱数。

解题思路:只要每次尽量拿最大的钱币,钱币数就一定最小哒

证明方法:显然法。。。

神秘代码:

例题二:HLOJP172

解题思路:将值排序之后将大小结合,两两结合尽量多,因此应把大的与小的放到一起,如果不可以结合就单独一组(大的),能结合的话就合为一组继续

证明方法:天知道。。

神秘代码:不发图不发图

#include<bits/stdc++.h>
using namespace std;
int zs,n,s=0,a[30001];
int main()
{
   
	cin>>zs>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	int i=1,j=n;
	while(i<=j)
	{
   
		if(a[i]+a[j]<=zs) {
   i++; j--; s++;}
		else {
   j--; s++;}
	}
	cout<<s<<endl;
	return 0;
}

例题三:HLOJP176

解题思路:枚举右端点,从小到大排序,如果一样就看左端点大小,之后看是否香蕉相交,这样策略一定最优

证明方法:反证法:右端点大的与别的线段冲突的概率大,只要和B有冲突的,必然和A有冲突,所以必然不要A


神秘代码:

#include<bits/stdc++.h>
using namespace std;
struct cow
{
   
	int id,left,right;
} a[51000];
int n,bzl,bzr,sum=1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值