各类基本算法
文章平均质量分 74
沂澜
这个作者很懒,什么都没留下…
展开
-
斐波那契数的迭代实现和递归实现
斐波那契数就是后一个数等于前两个数之和,举例 1,1,2,3,5,8,13,21,34,……一般来说,递归的算法思想简单,代码简洁,但是如果递归层数过深,容易栈溢出,因为没递归一次就要保存一次现场啊,然后回来一次还要恢复现场,迭代则是代码长点,但不用函数调用的开销。这里两种方法都给出。#include using namespace std;int fabonacciDIGUI(原创 2015-11-11 13:11:41 · 349 阅读 · 0 评论 -
prim算法求最小支撑树 打印支撑树边的集合 带图例说明
prim算法的思想是,给定一个集合 setX,初始为{ 1 },也就是只包含第一个顶点,和另一个集合 setY, 初始为 V - { 1 },找出一条权重最小的边(x,y),x 属于 setX, y 属于 setY,然后将这条边加入到最小支撑树中,同时 setX + { y }, setY - { y }。V 表示所有顶点集合。代码#include #include #in原创 2015-11-11 17:07:21 · 565 阅读 · 0 评论 -
cruskal算法求最小支撑树 打印支撑树的边集合 带图例
cruskal算法的思想很简单,就是把所有边按权值大小排序,由小到大,然后依次选一条边,如果这条边加入最小支撑树中不会造成回路,就把这条边加进去,否则取下一条边继续探测。如果这个图有 n 个顶点,则选出 n-1 条边即可。思想很简单,可实现却涉及到一种特殊的数据结构,叫不相交集。这种集合有两个主要的操作,一个是合并,就是将两个元素合并到这个集合中,合并时按秩合并的,秩大的作为秩小的原创 2015-11-11 16:20:05 · 900 阅读 · 0 评论 -
三着色问题 递归和迭代方法 打印着色方案
给一个图,这里用的是无向图,用三种不同的颜色给这个图中的所有点着色,要求有边关系的点不能着同样的颜色。跟8皇后问题很相似,每个点的候选颜色只有三种,对每个点进行颜色选择时,要判断是否与自己有边相连的点颜色冲突,如果冲突,则在候选颜色里选下一种,如果候选颜色选完了还没选到合法的颜色,则需要回溯,将上一点的颜色加1.代码#include #include #include #原创 2015-11-11 15:59:06 · 1006 阅读 · 0 评论 -
8皇后问题递归和迭代方法 打印皇后位置
8*8的棋盘,8个皇后放入其中,要求所有任何皇后不能在同一行同一列,也不能都在对角线线上对每一个皇后的候选位置进行探测,(每个皇后的候选位置都是从第一个到最后一个),如果当前位置不和之前的皇后冲突,则选下一个皇后的,否则就要向前回溯,把上一个选好位置皇后的位置往后移一个代码如下#include #include #include using namespace std;原创 2015-11-11 15:50:55 · 391 阅读 · 0 评论 -
旅行商问题 打印路径
从一个起始点(默认第一个点)出发,找到一条花费最短的路径经过所有其他点,然后又回到出发点,除了起始点经过两次,其他所有点必须经过一次且只能经过一次。这里用到了set, set是一个不包含重复元素的集合,表示还未访问到的点,函数fun( i, set ) 表示从点 i 经过set 中的所有元素的最短路径。这个问题可以这样分解,枚举 set 中的每个元素,选出点 i 到这个元素的距离原创 2015-11-11 15:20:07 · 734 阅读 · 0 评论 -
金钱兑换问题 动态规划 打印兑换后的硬币
有一个货币系统,有n 种硬币,每种硬币的面值为 v1,v2,……,vn, 且 v1 必定为 1 , 目的是兑换价值为 sum 的钱,让硬币数量最少。result[ j ] 表示价值总钱为 j 的最少硬币数,print[ j ] 表示价值钱数为 j 时用的是哪个硬币来换的。当只有 1 种 硬币时, 即只有面值为 1 的硬币,那有多少钱,兑换后的数量肯定就是多少。所以 result原创 2015-11-11 14:51:03 · 2670 阅读 · 0 评论 -
完全背包问题 打印背包中的物品
与0/1背包问题不同的是,每个物品可以任意次放,只要小于总容量就行,这里打印装进去的物品,还打印每种物品装了多少次代码如下:#include #include #include using namespace std;int main(int argc, char** argv) { cout<<"完全背包问题"<<endl<<endl<<"输入背包总容量"<<endl;原创 2015-11-11 14:39:56 · 1356 阅读 · 1 评论 -
0/1背包问题动态规划 空间复杂度是o(C)
有num个物品,总背包容量为Capacity, 求不超过背包总容量的前提下使得背包里的物品的价值达到最大的物品是哪些物品。对于每个物品,只有两种选择,要么装要么不装进背包。那么在考虑前 i 个物品时,在当前容量为 j 的条件下,如果这个物品的体积小于当前背包剩下体积,且装入此物品的价值比不装此物品的价值大,就装入此物品 ,设第 i 个物品的体积为 vol[ i ] ,价值 为 va原创 2015-11-11 14:32:03 · 5656 阅读 · 0 评论 -
双链表的各种操作 创建 插入 删除 查找
双链表的各种操作,考虑全面,所有操作的起始位置为1原创 2015-11-11 12:29:04 · 399 阅读 · 1 评论 -
无权图(有向或者无向)的 创建 插入边 删除边
用链表结构存储无权图,#include using namespace std;class Node{ public: Node()=default; Node(char val):value(val),next(nullptr){} inline Node*& getNext(){ return next; } inline char getValue(){原创 2015-11-11 12:52:17 · 3548 阅读 · 0 评论 -
回溯法求数字1,2,……n 的所有子集
求数字1,2,n 的所有子集,用一个数组position来保存每次要回溯时的位置,而且每次前进时的位置起点为上一次位置的后一个位置开始。原创 2016-03-11 16:28:11 · 1203 阅读 · 0 评论