一、什么是贪心算法
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打完表