摘要:关于全排列的代码在网上收集、研究了好几种,包括我自己写的也有循环实现。循环是最容易理解的,按照判定条件进行嵌套,但缺点是,如果有十个八个数据,循环嵌套的层数太深,十分臃肿。很明显,如果一段代码不够简练,我自己也不满意,肯定想尽办法解决它。所以再次记录一下全排列的递归实现。 还是按照自己的一套方法,以
阅读全文
随笔分类 - 算法题库
1
摘要:题:有三个城市a,b,c,一个人从a城出发,呆一天然后去另一个城市,经过四天,又回到a城的走法?解:把四天看成四个盒子,第一个盒子必定是a,然后在剩下的三个盒子里面置入数字,在置入数字的过程中,产生约束条件。(可以理解为带条件的"排列")比如说,a->b->c>b->a,可以看出,第二个盒子和第一个
阅读全文
摘要:/*------------完整代码@映雪-------------*/ /*初始化一组数据,省却输入,方便调试*/ #include using namespace std; typedef struct { int value[5];/*价值表*/ int weight[5];/*重量表*/ int num;/*数量*/ int limitw;/*最...
阅读全文
摘要:题目:集合A={1,2,3,5},从中任取几个数相加等于10,并打印各得哪几个数?补充参照:http://www.cnblogs.com/tinaluo/p/5294341.html上午弄明白了幂集的问题,不得不说这是一个极大的突破!只要把这个思路缕清楚了,就可以解很多问题。幂集问题,简而言之就是穷
阅读全文
摘要:我一直在想着这个事,早晨起来五六点,躺在床上冥想。突然悟解了,真如某些书上写的,大道不过三言两语,说破一文不值。还是按照老方法,把问题最大程度的精简,现在求集合A={a,b}的幂集,只有两个元素,应该有{a,b},{a},{b},{x}四种可能。如果把这两个元素弄清楚了,其余的也都一样, 仅仅是数量
阅读全文
摘要:/*摘自书本,这种算法很绕!*/
阅读全文
摘要:先把问题做最大程度的简化,不用框一个50*50的大迷宫,只需要压缩在3*3的二维数组中模拟,这个弄清楚了,再大的也是一样。移动方向只包括下移和右移两种方式。先下移,再右移。在这个二维数组中,约定规则:0表示通路,-1表示路径(可通过),1表示障碍物。于是得到一个二维数组的形式如下:(由于四周需要障碍
阅读全文
摘要:/*-----深度优先搜索----全排列--------*/ #include using namespace std; int a[10],book[10],n; void dfs(int step)/*step第几个盒子*/ { int i; if(step==n+1) { for(i=1;i>n; dfs(1); return 0...
阅读全文
摘要:穷举的一种应用,计算x+2y+3z=50的非负整数解。先约束每个变量的最大值,x=50,y=25,z=50/3。
阅读全文
摘要:计算1+2*3=,这个程序还是比较绕的,先将程序简化,只做+-*/和=五个运算符的关系。首先,假定这五个运算符中,=号的优先级最低,其次是+-,最高为*/。接着约定,"1+2*3=",为字符串。 第一步,将=号入栈,作为栈底。然后,再依次进行后续的比较。约定:栈顶符号<字符串符号,则字符串符号入栈。
阅读全文
摘要:另一种解法:将数组全部置1,累计相加到报数,则将该位置置为0,意为该位出列,如此反复。关键在于:把数组作环状处理,这个手法已经演练很多遍了!
阅读全文
摘要:/* 此解法有一bug,假如有8个人,从第一个人开始数,每说到1就删除,相当于自删除,程序崩溃 */约瑟夫问题,有n个人,编号为1,2,...,n,围成一个圆圈,按照顺时针方向从编号为k的人从1开始报数,报数为m的人出列,如此重复下去,直到所有的人都出列。编写一个算法,要求输入n,k,m,按照出列的
阅读全文
摘要:/*网络摘录加工*/尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代
阅读全文
摘要:问题提出:求数组A={1,5,7,22,9}中的最大值。这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。 另一种精简的算法,来源于《算法:C语言实现》117页 这种思路简化说明:把一个数组不停的二分对切,只到不能再切为止(切到只有一个元素时
阅读全文
摘要:计算1+2+3+4+5第一种,从后往前加。 第二种,从两边对加,例:(1+5)+(2+4)+3,需要判定,假如元素个数为偶,则左边+1==右边,如果为奇数,则左边==右边:
阅读全文
摘要:有一个背包最多可装重量8千克的物品,假设要用该背包装如下水果,要求使背包中装的物品的价值最大,应该装下列哪些物品才能达到要求? 解题思路:首先穷举所有组合可能,有5种物品,一共组合32-1种可能。然后排除超重的可能,在不大于8千克的前提下,再计算各种可能的总价值,最后,比较这些组合的价值,得到最大值
阅读全文
摘要:《编程之美》221页,问题:字符串scr=“AABCD”,字符串des="CDAA",循环移位src,是否包含串des? 首先考虑的是移位的问题,有两种可能,要么左移,要么右移,书中采用的是左移的方式。在移动AABCD之后,得到 ABCDA,问题就在于这个最先移动的A放在哪?根据前面的学习,马上可以
阅读全文
摘要:#include using namespace std; void draw(int n,int x) { if(x0) { draw(n-1); draw(n,1); cout using namespace std; int main() { for(int i=1;i<=9;i++) { ...
阅读全文
1