随笔分类 -  算法

摘要:问题:现在有10份工作。有300名工人被分配参与这10份工作,每份工作需要30人。每人参与不同的工作都有个评价值,代表该人参与该工作的损耗值,损耗值的范围在0-9。问:如何分配这300人工作,使得总的损耗值最低。利用遗传学算法求解工作分配问题。 阅读全文
posted @ 2021-07-24 10:54 万仓一黍 阅读(799) 评论(1) 推荐(0) 编辑
摘要:问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形。 那么一共可以有多少个解呢?(若通过旋转、翻转一个解而得到的新解,则两个解视为同一个解) 首先,求解的问题,已经在上一篇帖子里完成 算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题 帖子里用随机的方法求解,故每次求出 阅读全文
posted @ 2020-02-29 21:52 万仓一黍 阅读(1143) 评论(2) 推荐(1) 编辑
摘要:问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形。如何用计算机求解? 解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化 用13块不同形状的俄罗斯方块(每个方块只能使用一次)覆盖住棋盘,很容易就想到这是“精确覆盖问题”(13个俄罗斯方块完全覆盖住8*8的正 阅读全文
posted @ 2017-12-02 14:50 万仓一黍 阅读(4368) 评论(3) 推荐(3) 编辑
摘要:当今社会,智能手机的飞速发展。使得可以做到人手一部智能手机。而各种应用层出不穷。手游(手机游戏)的出现,满足了人们对打发碎片时间的需求。而在游戏中,宝物升级是最常见的剧情元素之一。而优秀的游戏设计师,在设计宝物升级系统时,要难易适中,要能把用户黏合在自己的游戏中,既不能太难,也不能太简单。那么如何设... 阅读全文
posted @ 2015-03-16 12:19 万仓一黍 阅读(1803) 评论(0) 推荐(1) 编辑
摘要:这道题是笔者当年参加竞赛的题目,多年来一直未得其解,久久不能释怀。近日,重新拿起该题细细研究,终于将其解出,著文以记之。问题描述:长方体长X,宽Y,高Z。X、Y、Z都是正整数。长方体由长1、宽1、高1的正方体堆积而成。那么长方体的体对角线穿过多少个正方体?这个题考量三维空间的想象。近日研究的时候,尝... 阅读全文
posted @ 2014-06-19 11:59 万仓一黍 阅读(13916) 评论(7) 推荐(3) 编辑
摘要:问题描述:甲乙两人比赛投篮。约定甲先投篮,每人投篮投进一球,则继续投球,若投失一球,则换人投球。初始积分为1分,甲每投进一球,积分加1分;乙每投进1球,积分减1分。若积分达到N分(N>1),甲获胜;若积分减至0分,乙获胜。假定甲投进的概率为P1(0<P1<1),乙投进的概率为P2(0<P2<1)。那么这场投篮比赛,甲获胜的概率P为多少?很显然的,甲获胜的概率P是和P1、P2、N相关的。P1越大,P越大P2越大,P越小N越大,P越小不失一般性,假设P1=0.7,P2=0.3,N=4,求甲获胜的概率P解法一:大数量模拟法(10000000次)在前文 算法题——投篮比赛获胜的概率 中介绍的就是这种方 阅读全文
posted @ 2013-12-05 09:35 万仓一黍 阅读(3249) 评论(5) 推荐(1) 编辑
摘要:问题描述:在下图里我们有不同高度的挡板。这个图片由一个整数数组所代表,数组中每个数是墙的高度。下图可以表示为数组(2、5、1、2、3、4、7、2)。假如开始下雨了,那么挡板之间的水坑能够装多少水(水足够多)呢?下图是装满水的情况,一个蓝色格子代表一个单位的水。下图中一共装了10个单位的水。问题分析:先看看下图,判断哪个单元格的水能留下来。下图中的两个单元格,一个红色的单元格和一个绿色的单元格,哪个单元格的水是溜走了,哪个单元格的水能留下来?很明显的,上图中的红色单元格的水会流走,绿色单元格的水会被留下来。那么,仔细看看这两个单元格的区别在哪儿区别就是,红色单元格只有右边的挡板比它高(不低于它) 阅读全文
posted @ 2013-11-08 12:53 万仓一黍 阅读(4910) 评论(9) 推荐(2) 编辑
摘要:给定一个字符串,仅由A、B、C3个字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如有AB或BA连续出现,你把它们替换为字母C;有AC或CA连续出现时,你可以把它们替换为字母B;有BC或CB连续出现时,你可以把它们替换为字母A。可以不断反复按照这个规则进行替换,目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。输入:字符串。长度不超过200,仅由ABC3个字母组成。 输出:按照上述规则不断消除替换,所得到的字符串最短的长度。 阅读全文
posted @ 2013-09-07 12:15 万仓一黍 阅读(2309) 评论(6) 推荐(1) 编辑
摘要:先回顾之前的三篇文章“算法实践——数独的基本解法”,介绍求解数独的基本的暴力搜索法“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”,网友huangfeidian介绍的求解数独的舞蹈链(Dancing Links)算法,这篇文章是介绍舞蹈链(Dancing Links)算法的。“算法实践——舞蹈链(Dancing Links)算法求解数独”,该文介绍了用舞蹈链(Dancing Links)算法求解数独,并给出了暴力破解法和舞蹈链(Dancing Links)算法之间的时间和空间占用效率的对比。撇开空间占用的效率不谈,在前文中有下面的时间效率的数据对比暴力破解法的效率数 阅读全文
posted @ 2013-07-25 11:43 万仓一黍 阅读(8326) 评论(3) 推荐(0) 编辑
摘要:在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题。本文介绍该算法的实际运用,利用舞蹈链(Dancing Links)算法求解数独在前文中可知,舞蹈链(Dancing Links)算法在求解精确覆盖问题时效率惊人。那利用舞蹈链(Dancing Links)算法求解数独问题,实际上就是下面一个流程1、把数独问题转换为精确覆盖问题2、设计出数据矩阵3、用舞蹈链(Dancing Links)算法求解该精确覆盖问题4、把该精确覆盖问题的解转换为数独的解首先看看数独问题(9*9的方格)的规则1、每个格子只能填 阅读全文
posted @ 2013-07-07 16:30 万仓一黍 阅读(47782) 评论(12) 推荐(7) 编辑
摘要:精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1例如:如下的矩阵就包含了这样一个集合(第1、4、5行)如何利用给定的矩阵求出相应的行的集合呢?我们采用回溯法矩阵1:先假定选择第1行,如下所示:如上图中所示,红色的那行是选中的一行,这一行中有3个1,分别是第3、5、6列。由于这3列已经包含了1,故,把这三列往下标示,图中的蓝色部分。蓝色部分包含3个1,分别在2行中,把这2行用紫色标示出来根据定义,同一列的1只能有1个,故紫色的两行,和红色的一行的1相冲突。那么在接下来的求解中,红色的部分、蓝色的部分、紫色的部分都不能用了,把这些部分都删除, 阅读全文
posted @ 2013-06-30 14:18 万仓一黍 阅读(78275) 评论(19) 推荐(42) 编辑
摘要:数独(Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。如下图所示,就是一个数独的题目关于数独的详细介绍,参看“百度百科——数独”数独的基本解法就是利用规则的摒弃法一些定义每一行称为数独的行,每一列称为数独的列,每一个小九宫格称为数独的宫。数独的基本规则就是每一行、每一列、每一宫中,1-9这9个数字都只出现一次。用(行,列)表示上图的单元格,例如(1,1)表示第一行 阅读全文
posted @ 2013-06-19 08:37 万仓一黍 阅读(104902) 评论(21) 推荐(6) 编辑
摘要:1、1、2、3、5、8、13、21、……。这个数列称为斐波那契数列(Fibonacci Sequence)。它有个奇妙的性质,记FN为斐波那契数列的第N项,则当N比较大的时候FN/FN+1≈0.618斐波那契数列有两个常见的通项公式(具体的推导过程就忽略了)1、FN=FN-1+FN-2(N>2),F1=1,F2=22、这个数列的前两项F1=1,F2=1才称为斐波那契数列,如果这个数列的前两项是其他数字(正数),并且还有FN=FN-1+FN-2(N>2)的递推关系,那么这样的数列,我称之为类斐波那契数列,它是否还有当N比较大的时候,FN/FN+1≈0.618这个奇妙的性质呢?答案是肯 阅读全文
posted @ 2013-04-30 17:04 万仓一黍 阅读(4890) 评论(2) 推荐(2) 编辑
摘要:之前发了一篇博文“24点的所有组合的解法”,有人颇不以为然。我想说的是,发这篇文章是说明我可以用计算机求出24点的所有组合的解法。而在实际的运用中,如果要使用24点的算法有时还不见得利用查表法来得简单和快速。毕竟,要短时间内写出正确的算法并验证,也不是一件很容易的事。24点游戏的规则:给定4个正整数(1到10),利用加减乘除运算,得出运算结果为24的运算式例如:1,2,3,4——(1+2+3)*4=241,5,5,5——(5-1/5)*5=24网上比较常见的24点算法是动态规划算法(这个在博客园中也能搜索到)。定义6个二元运算符:加、减、乘、除、反减、反除然后从4个数中任选2个数,通过一种运算 阅读全文
posted @ 2013-03-17 17:18 万仓一黍 阅读(11652) 评论(10) 推荐(1) 编辑
摘要:问题的描述:现在有N个一模一样的苹果,要放在编号为1、2、3……、N的盘子里(假设盘子足够大,能放下所有的苹果),问一共有多少种放法? 算法分析: 用符号F(i,j)表示i个苹果放在j个盘子里的放法数 如果1号盘子里没有苹果,则i个苹果要放在剩余的j-1个盘子里 如果1号盘里有1个苹果,则剩余的i-1个苹果放在剩余的j-1个盘子里 如果1号盘里有2个苹果,则剩余的i-2个苹果放在剩余的j-1个盘子里 以此类推 如果1号盘里有i-1个苹果,则剩下的1个苹果放在j-1个盘子里 如果1号盘里有i个苹果,则剩下的j-1个盘子里没有苹果 于是得到以下的关系式 ① F(i,j)... 阅读全文
posted @ 2012-11-19 16:29 万仓一黍 阅读(3930) 评论(8) 推荐(3) 编辑
摘要:有一段时间没有写博客了。今日闲逛的时候,看到一篇博客“4月7日某公司在华南地区举办了一年一度的"开发者"聚会——记某公司笔试”。里面有作者回忆的面试题。其中一题引起了笔者的注意,题目如下: 题目:已知一个数组a[N],构造一个数组b[N],构造规则:b[i]=a[0]*a[1]*a[2]...a[N]/a[i]; 要求: 1、不可以使用除法; 2、时间复杂度为O(n),空间复杂度为S(0); 3、除遍历使用的变量外,不可以使用其它变量; 看似简单,想想也废了一番脑筋。 最先想到的是就是原作者想到的方法,代码如下(用的是VB2008): Public Sha... 阅读全文
posted @ 2012-04-07 19:23 万仓一黍 阅读(3643) 评论(30) 推荐(1) 编辑
摘要:原题:一个正整数,转成二进制后,这个二进制数包含多少个1? 这个问题在网上看过多次,几番思考,也没有什么好的办法。采用最基本的办法,逐位判断,是1的统计加1,最后将统计数返回。 以下是这个思路的VB2008代码,不失一般性,将正整数的范围控制在(1~231-1) Private Function GetCount1OfValue(ByVal Value As Integer) As Integer Dim i As Integer, Count As Integer = 0 For i = 0 To 30 If (Value And 2 ^ i) = 2 ^ i Then Count += . 阅读全文
posted @ 2011-06-10 09:07 万仓一黍 阅读(11798) 评论(36) 推荐(5) 编辑
摘要:原题在“两道TB面试题”文章中。今日在本文中,就个人的理解再阐述一遍。 题目1:有一个数列,它由3个数列复合而成,并升序排列。三个数列分别是2的n次,3的n次,5的n次,0≤n<∞。给出前几项:1,2,3,4,5,8,9,16,25,27………………即20(30, 50) , 21, 31, 22, 51, 23, 32, 42, 52, 33。问你如何快速得到第1000000个数的值。 问题2:有一个数列,它由3个数列复合而成,并升序排列。三个数列分别是2的n次,3的n次,5的n次,1≤n<∞。给出前几项:2,3,4,5,8,9,16,25,27………………即21, 31, 22 阅读全文
posted @ 2011-04-20 08:56 万仓一黍 阅读(3550) 评论(9) 推荐(2) 编辑
摘要:题目:给定一个数字,和一个范围,产生所有在范围内的不重复的数字之和,和等于给定的数字。 举例:给数字12,范围3-6。可以产生以下5个组合: 1、3+3+3+3 2、3+3+6 3、3+4+5 4、4+4+4 5、6+6 要求给出最快实现,并且是非递归。 这是某人给我出的一道算法题。经过考虑,给出了解法。最快的谈不上(算法无止境、人外有人),没有用递归。 还是以题目的例子说明,数字12,范围3-6。给出了5种组合。将这5种组合改写一下 3+3+3+3=3*4+4*0+5*0+6*0 记作:(4,0,0,0) 3+3+6=3*2+4*0+5*0+6*1 记作:(2,0,0,1) 3+4+5=3. 阅读全文
posted @ 2011-03-31 09:01 万仓一黍 阅读(2414) 评论(5) 推荐(3) 编辑
摘要:近日,在和他人闲暇无事的时候,进行篮球投篮比赛。由于本人的投篮命中率比较低,而他的投篮命中率比较高。因此,定了一个规则。采用积分制,初始积分为1分。他投篮,每投中一个球,积分加1分,继续投篮;投不中,换我投篮。我投篮,每投中一个球,积分减1分,继续投篮;投不中,换他投篮。若积分到11分,他获胜;若积分减到0分,我获胜。每局由他先投篮。 在进行若干局的比赛后,各有胜负。提出了一个问题:他获胜的概率是多少? 把问题数字化 A和B两人进行投篮,A的命中率为70%,B的命中率为30%。初始积分为1分,每人投中继续投,投不中换人投。A投中积分加1分,B投中积分减1分。积分为11分时,A获胜;积分为0分. 阅读全文
posted @ 2011-03-22 13:20 万仓一黍 阅读(3206) 评论(5) 推荐(4) 编辑