0
点赞
收藏
分享

微信扫一扫

贪心算法的介绍+枚举算法的介绍(brute force)

八卦城的酒 2022-04-13 阅读 55

一、什么是贪心算法

1. 举个例子:

问题如下:
纸币面额有1元、2元、10元、100元。问凑出正好x元最少要多少张纸币?

2. 在贪心中排序和优先队列会用的比较多(抓住这两个重点),在这里过一下sort的知识点

(1)sort

int nums[1005]; // 数组
填充数组数据有 n 个
sort(nums, nums + n); //排序从0 - n - 1,默认按照从小到大排序

- 那么想从小到大排序呢?
- 写一个bool cmp() 函数  cmp:这个函数名字无所谓的,想叫什么叫什么
- 举例如下:
// 我这里是对int型数据进行排序的
bool cmp(int x, int y) {
	return x > y; // x真大于y,为true,就排在前面,也就是大的数字排在了前面,从大到小排序 (我是这么记忆的)
}

sort (nums, nums + n, cmp);

(2)关于优先队列,我写过一篇关于stl的粗略实操,可以过一下,或者上网找教程看一下

STL 相关知识点粗略浅过一下(包括迭代器)

二、枚举的介绍(两种:朴素和状压)

1. 朴素枚举

2. 状压枚举:所有的状压枚举都是可以用dfs(深度优先搜索)来写的,但是状压枚举写不了dfs:

(1)适合场景

(2)二进制状压枚举的写法:

模板
二进制
for (int i = 0; i < 1 << n; ++i) { // i为从1到2^n的状态压缩值 2^n
	int p = i; // 先将i取出
	int sum = 0// 用一个变量来维护取出的数之和
	for (int j = 0; j < n; ++j) {//转为二进制进行操作
		sum += p % 2 * a[i]; // 求取出来的数之和,p % 2为对应的二进制位 (&1)
		// 中间可以进行其他的操作
		p /= 2; // 求下一个二进制位,或者p >> 1右移一位
	}
	// 这里可以添加想要的操作
}

三进制同理,添加一步预处理操作,把3^n打完表

三、对于贪心和枚举的练手题,会单独再整理出来

举报

相关推荐

0 条评论