这个题dfs的套路跟板子可以说是几乎无相同之处,但他的快是无法想象的。
1.迭代加深 我们寻找最小值,就直接从0开始找,也就是选0包能行吗,选1包能行吗,选2包能行吗 … 选m包能行吗
2.优先选择选择性最低的,我们这里对数据这样处理,一包糖就是一个二进制数,那么我们想凑够m种糖,我们就从含有第一种糖的包里挑一个,但是剩下的几种没选的糖,大概率是包数不一样的,例如 我们现在只有第一种糖和第二种糖没有,第一种糖,50包里有,第二种糖只有1(这里我们说这一包糖叫sniper)包里有,那么其实我们选sniper,就一定是最优解,并且这包里还可能含有第一种糖,可能直接优化掉下一步对50包糖的搜索。(这步优化是根据题目来的)
3.估值函数 估值估值,没必要太准确,大致推推就行,因为如果你弄的太细,会加高时间复杂度,么得必要
这里估值函数的意思就是估计一下当前的这个状态,最少选多少步就能达到最优解,那么也就是说你剩余的步数少于这个的话一定不对了。这里采用的估值逻辑是遍历剩下的糖的种类,让他们含有这些糖的糖包都算一个糖包,然后把这些糖包含的糖的种类都算到原状态里。
(其中第一点与第三点是IDA*的常规操作)
4.除此之外,下面的代码用到了大量二进制运算,以及lowbit优化,lowbit运算得到原二进制数第一位不为0的数,即lowbit(1010)= 0010,我们如果设四位二进制,代表四种糖,为1表示没选,为0表示选过了,那么我们lowbit(i) 就是第一种没选的糖,i - lowbit(i) 就是第二种没选的糖。
感想:怎么说呢,题挺难的,这个算法是专门针对重复覆盖问题的,所以记住也可,然后就是多做题,熟了就行了。这个算法其实第二个优化并不是主优化,主优化应该是第三步的估值函数,这是关键,那么针对不同问题,我们的估值函数到底写成什么样合适,那么其实就是一个对题目的感觉了,所以多做题!
1243. 糖果

糖果店的老板一共有 M 种口味的糖果出售。

为了方便描述,我们将 M 种口味编号 1∼M。

小明希望能品尝到所有口味的糖果。

遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。

幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。

给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

输入格式
第一行包含三个整数 N,M,K。

接下来 N 行每行 K 这整数 T1,T2,⋅⋅⋅,TK,代表一包糖果的口味。

输出格式
一个整数表示答案。

如果小明无法品尝所有口味,输出 −1。

数据范围
1≤N≤100,
1≤M,K≤20,
1≤Ti≤M
输入样例:
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
输出样例:
2

#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int N = 110, M = 1 << 20;int n, m, k;
vector<int> col[N];
int logg[M];//二进制向糖果种类的转化 int lowbit(int x)
{return x & -x;
}int h(int state)  // 最少需要再选几行
{int res = 0;for (int i = (1 << m) - 1 - state; i; i -= lowbit(i))//logn{int c = logg[lowbit(i)];res ++ ;for (int row = 0; row < col[c].size(); row++) i &= ~col[c][row];//最优解作为估值 }return res;
}bool dfs(int depth, int state)
{//这里dfs中的depth是倒着来的,depth为3的时候代表选3行达到最优解,但其实depth为3是三行中的第一行,而depth为1是最后一行 if (!depth || h(state) > depth) return state == (1 << m) - 1;//depth=0代表选完了,选完了比较比较返回就完事了//h(state)估值函数,先预估一下当前这个状态,我再选最少选几步可以// 找到选择性最少的一列int t = -1;//特判 //当前可能是缺很多种糖果,但是我们选择,选择性最少的那一种//意思就是:第一种糖果在50包里有,那第二种糖果只有一包有,那我们选择只有一包的 for (int i = (1 << m) - 1 - state; i; i -= lowbit(i)){int c = logg[lowbit(i)];if (t == -1 || col[t].size() > col[c].size())t = c;}// 枚举选哪行 for(int row = 0; row < col[t].size(); row ++)if (dfs(depth - 1, state | col[t][row]))return true;return false;
}int main()
{cin >> n >> m >> k;for (int i = 0; i < m; i ++ ) logg[1 << i] = i;for (int i = 0; i < n; i ++ ){int state = 0;for (int j = 0; j < k; j ++ ){int c;cin >> c;state |= 1 << c - 1;}for (int j = 0; j < m; j ++ )if (state >> j & 1)col[j].push_back(state);}int depth = 0;while (depth <= m && !dfs(depth, 0)) depth ++ ;if (depth > m) depth = -1;cout << depth << endl;return 0;
}

Acwing 1243 糖果 - IDA*估值函数相关推荐

  1. 洛谷 P2534 [AHOI2012]铁盘整理(IDA*(dfs+迭代加深+估值函数))

    题目链接:P2534 [AHOI2012]铁盘整理 题解:本篇为IDA*的应用,做这题前建议先做前一篇文章的题目:点这 这题中难在估值函数的确定,总的来说IDA*基本上格式都差不多,主要难在估值函数的 ...

  2. 计算机博弈六子棋估值函数,机器博弈中搜索策略和估值函数的设计

    何轩 洪迎伟 王开译 彭耶萍 摘要:机器博弈是人工智能的头部领域.该文以六子棋为例,重点介绍了搜索策略和估值函数的设计,主要介绍了博弈树,极大极小值算法,α-β剪枝,MCTS以及基于"路&q ...

  3. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  4. 05 ,效果评估 : 估值函数

    1 ,估值函数 : 残差平方和 : 真实值 - 预测值 类似方差项 : 类似于方差的计算方式,但是没有除以 m 估值函数 : 2 ,效果评估 : 好 : 越接近于 1 越好 差 : 越接近于 0 越差

  5. hud 1560 DNA sequence(IDA* 迭代加深搜索+估值函数)

    传送门 题目: Problem Description The twenty-first century is a biology-technology developing century. We ...

  6. IDA的函数操作,与导航操作;

    函数操作 实际上,反汇编并不是完全连续的,而是由分散的各函数拼凑而成的.每个函数有局部变量.调用约定等信息,控制流图也只能以函数为单位生成和显示,故正确定义函数同样非常重要.IDA也有处理函数的操作 ...

  7. AcWing 4247. 糖果(差分约束最短路)

    题目连接 https://www.acwing.com/problem/content/4250/ http://poj.org/problem?id=3159 思路 假设第i个同学得到的糖果数量为a ...

  8. IDA 显示函数名称技巧

    在IDA中,我们可以经常看到这种 all memset push esi ; unsigned int call ??_U@YAPAXI@Z ; operator new[](uint) push e ...

  9. 算法提高课-图论-差分约束- AcWing 1169. 糖果:spfa求单源最短路、差分约束

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 差分约束系统 差分约束系统是一种特殊的N元一次不等式组.它包含N个变量X1,...,XnX_1,...,X_nX1​,...,Xn​ ...

  10. AcWing 1047. 糖果

    由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券. 在这一天,Dzx可以从糖果公司的 N 件产品中任意选择若干件带回家享用. 糖果公司的 N 件 ...

最新文章

  1. Zookeeper 的典型应用场景场景
  2. OCP读书笔记(5) - 使用RMAN创建备份
  3. 你需要一个首席数据官吗?
  4. 冒泡排序html代码,冒泡排序.html
  5. java基础---集合collection的方法介绍
  6. SAP odata模型缓存校验机制
  7. [转] 我回答了90%的面试题,为什么还被拒?
  8. 【建议珍藏系列】如果你这样回答「什么是线程安全」,面试官都会对你刮目相看!...
  9. 1971旗舰cpu intel_AMD依然yes!官宣锐龙5000系列CPU,单核性能首次超越英特尔,苏妈:最好的游戏CPU!...
  10. 几何畸变图像恢复 openCV3 - 数字图像处理作业3
  11. Vue项目安装axios报错
  12. 彻底删除VMware !!!
  13. theano java_Windows Theano GPU 版配置
  14. java 键盘 映射 控制游戏_如何运用JAVA程序设计进行键盘控制游戏
  15. 67 Ways to Increase Conversion with Cognitive Biases
  16. Count the Tetris
  17. FRECO联盟探营:未来还看这些“小字辈”
  18. Java身份证号校验
  19. Ktor实现Https双向认证
  20. 阿克曼(Ackermann)函数—递归

热门文章

  1. JavaScript系列:模块化与链式编程
  2. 用Mediator Pattern + Queue 解决 订单处理流程
  3. (原创)日志处理(修改)
  4. 拓端tecdat|数据分析促进白血病预测诊断
  5. 在Java环境下怎么打开_Java环境配置及在Dos命令下运行Java程序
  6. jdk中java程序调试_jcmd:JDK14中的调试神器
  7. L1-8 估值一亿的AI核心代码 (20 分)
  8. Linux下卸载miniconda3(Anaconda类系)
  9. 操作系统 读者-写者问题
  10. Java EE实战教程 servlet (一)