今天讲背包问题的最后一种解法,递归解法,这种解法也是目前算法教材上讲的基本解法之一,如果你有一本关于这类算法的书籍,一般都可以找到你想要的算法,背包问题具体是什么,大家可以参考我的以前的文章,可以直接到下面的相关链接里面找到,我在最近发布关于背包问题的基本解法,动态规划解法,回溯解法,大家可以直接参照我的页面链接,如果具体还有问题不懂的话,也非常欢迎大家留言
好的,讲一讲递归算法,我提供的算法是使用了有效重量,最大可用价值作为递归参数逐个测试物件的重量和价值,直到找到最佳的侯返回,请注意,这里我设置的条件是只要满足背包可以放就可以,并不是贪心算法,请注意区别。
Read more…
说明:最近整理了我学习PHP的一些相关手记,在这里跟大家分享,另外最近研究了WP的源代码,小有心得,我打算在过了元旦假期之后跟大家分享,最近比较忙了,博客更新也没有以前那么频繁了,不过我会保持每天一到两篇的速度更新内容,如果各位喜欢我的博文的话,欢迎大家订阅我一般每天晚间9点以后更新我的博客,可以确保你每天早上第一时间看到我的博文
Read more…
今天再讲点跟N皇后有关的问题,骑士遍历问题,或者象棋中马的遍历问题,当然这里的马是国际象棋了,两者有着很多相似点,同时又有很多不同点,主要还是限制路径的区别,N皇后主要是自由放置只要满足条件就好,马的遍历则跟上下遍历的路径有关了,主要运用了图算法之深度广度遍历,以及图的建立等算法。
要求:实现棋盘上任意位置的一个棋子马,使它不重复的走过棋盘上的每一个棋盘格
分析:首先知道马在棋盘是怎么走的,根据国际象棋规则,马在一个起始位置共有8个可用的行动位置,当然边界方面需要另外考虑,我们的马的行走必须考虑这8种类可能性,排除不能使用的位置,走可用的位置,当8个位置不可以使用的时,需要考虑返回上一步,这点有点像图的广度优先遍历相同,当马走完所有位置,同时没有可用的位置用于行走的时候遍历结束。
Read more…
今天讲点比较高级的算法,目的也很简单,求质数,但是应用一种新的算法Miller-Rabin算法,这是一种利用了概率和费马小定理的算法设计,有点玄乎吧,其实本人也是刚接触这种算法,这是一种纯数学的解法,如果各位不懂,当学习一下数学也好啊好,我们往下讲
首先了解基本的数学知识,费马小定理:
若n是素数,则对所有1≤a≤n-1的整数a,有a^(n-1)mod n=1;
作者Fermat 很牛的数学家,在他在世的时候好像还没有计算机,不过今天我们要用这个定理来设计算法
分析这个定理可以知道,如果一个数是质数,那么它必定满足任意一个整数属于(1,n-1)范围有a^(n-1)mod n=1,不懂?我们取逆否命题试试看,就是只要存在在(1,n-1)范围中的整数a 使得a^(n-1)mod n=1不成立,那么这个数就不是素数,相信明白了吧,我们要确定一个数是否是素数,只要随机生成一系列的数a,如果这些数a使N满足费马小定理的话那么就可以认定它是素数了,当然有个前提,就是这个推导只能在计算机领域内使用就跟我上次讲的用哥德巴赫猜想优化一道算法题目一样,在计算机可以运算的数的范围内可用,请不要在其他科学领域类使用
Read more…
今天继续背包问题相关解法,主要内容:动态规划
想到这个解法是想到了前几天的一道软考软件设计师考试的下午算法考题,我是参加者,内容大概如下:通常每种食物往往有不同的营养价值,顾客往往需要一种算法实现用最少的花费获得最高的营养价值,(食物不重复),现在要求在花费N元钱获得最大营养价值
分析:相信求解的原理不用说了,背包问题,软考的题录使用的是动规算法,跟今天的主题相关,那我们看下面的代码吧。
本题动规解法的原理:由于客户选择不同的食物会产生不同的营养结果,因此我们需要动态绑定两者之间的价格和营养价值总和和关系,建立一个关联数组,这样的话每一种价格花费会产生不同结果,我们再进行大小筛选,就是在已有的选择的前提下再增加一定价格的食物,如果相加之后超出则排除,或者相加它的营养价值之后小于相加一种更价格便宜的食物的话也排除,这样可以求出每一个价位的食品的最大营养价值,然后根据要求输出某一价位的结果
Read more…
今天讲点比较枯燥的理论知识,关于C语言的安全指针,如果你习惯于用C语言,那么会知道C语言的指针操作是很不安全的,但是这反而是C语言的特色之一,同时增强了C语言的灵活性和高效性,我本人也是比较偏爱于C语言的,并不是C++或者其他语言在算法方面不行,而是C语言的算法表述更加易于理解和运行更加高效,往往专家编程或者高效编程会采用C或者它的发展C++,但是对于初学者来说,要正确运用好C尤其是它的指针确实比较困难,所以我在此讲解几种C安全指针的处理方法。但是在此说明,请保持良好的编程习惯和正确的C指针处理方法,本文只提供一些
Read more…
圣诞前夜讲点比较具有圣诞感觉的算法,背包问题算法,这里我写了经典算法和贪心算法两种解决方法,因为时间不多,所以给出的数组是已经排序的,因为贪心算法可能要用得到,经典算法因为是一个一个比较,因此排序也就没有那么重要了,可能两种算法的最终运行效果一样的,朋友们调试的时候记得修改我给出的测试数组,今天实在太忙了,贪心使用的排序算法没有写,留着以后给大家讲排序算法的时候使用吧,圣诞快乐,诸位朋友们。
背包问题:就是现在有一个容量为PSIZE的背包,同时又有N件item,现在要求将这些item放入这个背包里面去,要求尽量放一定要求的item(比如按照大小的顺序),又要求放最多的item或者放的item权值之和要最大
Read more…
Recent Comments