![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
essenge
顺势而为
展开
-
概率算法和近似算法
概率算法和近似算法是两种另类算法。概率算法在算法执行中引入随机性,近似算法采用近似算法来解决优化问题。1.概率算法概率算法也叫随机化算法,允许算法在执行过程中随机的选择下一个计算步骤。在前面几章所讨论的算法中,每一个计算步骤都是固定的,而概率算法允许算法在执行过程中随机的选择下一个计算步骤。概率算法大致分为以下四类:...原创 2020-12-24 20:38:29 · 857 阅读 · 2 评论 -
求解旅行商(货郎担)问题的五种方法
1.回溯法原创 2020-12-24 15:24:37 · 1401 阅读 · 1 评论 -
图的四种最短路径算法
1.迪杰斯特拉算法int u;int minx;for(int i=1;i<=n;i++) dst[i]=edge[1][i];for(int i=1;i<=n;i++) book[i]=0;//初始化book[1]=1;for(int i=1;i<=n-1;i++){ minx=inf; for(int j=1;j<=n;j++){ if(book[j]==0&&dst[j]<minx){原创 2020-12-23 20:02:56 · 1199 阅读 · 0 评论 -
动态规划法求解最长公共子序列问题
状态转移方程如下:#include<stdio.h>#include<vector>#include<string.h>#include<iostream>using namespace std;#define max(x,y) (x)>(y)?(x):(y)#define MAX 51int m,n;string a,b;int dp[MAX][MAX];vector<char>subs;void LCSlen原创 2020-12-19 16:51:38 · 153 阅读 · 1 评论 -
动态规划法求解三角形最小路径问题
特殊情况:两个边界,即第1列和对角线达到它们中结点的路径只有一条而不是常规的两条。状态转移方程:#include<stdio.h>#include<vector>#include<string.h>#include<iostream>using namespace std;#define MAXN 100int a[MAXN][MAXN];int n;int ans=0;int dp[MAXN][MAXN];int pre[.原创 2020-12-19 16:38:47 · 370 阅读 · 1 评论 -
动态规划求解最大连续子序列和问题
状态转移方程:#include<stdio.h>#define max(x,y) (x)>(y)?(x):(y)#define MAXN 20#include<iostream>using namespace std;int n=6;int a[]={0,-2,11,-4,13,-5,-2};int dp[MAXN];void maxSubSum(){ dp[0]=0; for(int j=1;j<=n;j++){ dp[j]=max(dp原创 2020-12-19 16:25:32 · 489 阅读 · 1 评论 -
动态规划一多段图
1.逆序解法#include<string.h>#include<map>#include<cstdio>using namespace std;#define MAX 21#define INF 0x3f3f3f3fint n;int start,end;int c[MAX][MAX];int next[MAX];map<int,char *>vname;int dp[MAX];int Count=1;void Init()原创 2020-12-19 16:15:57 · 173 阅读 · 1 评论 -
贪心法求解赶作业问题
#include<algorithm>#include<cstdio>using namespace std;#define max(x,y) ((x)>(y)?(x):(y))#define MAX 101struct Action{ int no,deadline,score; bool operator < (const Action t) const { if(score==t.score) return deadline<t.deadli原创 2020-12-10 21:12:07 · 2765 阅读 · 0 评论 -
贪心法求解加工木棍问题
#include<iostream>#include<string.h>#include<algorithm>#define MAXN 10010using namespace std;int t,n;struct NodeType{ int l,w; friend bool operator <(NodeType a,NodeType b){ if(a.l!=b.l) return a.l<b.l; return a.w<b.原创 2020-12-10 14:26:36 · 186 阅读 · 0 评论 -
贪心法求解哈夫曼编码问题
#include<iostream>#include<queue>#include<vector>#include<string>#include<map>using namespace std;#define MAX 101int n;struct HTreeNode{ char data; int weight; int parent; int lchild,rchild;};HTreeNode ht[MAX];m原创 2020-12-10 14:18:13 · 191 阅读 · 0 评论 -
贪心法求解流水作业调度问题
#include<stdio.h>#include<algorithm>#include<iostream>using namespace std;#define max(x,y) ((x)>(y)?(x):(y))#define N 100int n=4;int a[N]={5,12,4,8};int b[N]={6,2,14,7};struct NodeType{ int no; bool group; int time; bool原创 2020-12-10 13:52:59 · 606 阅读 · 0 评论 -
求解最小机器重量设计2
1.采用回溯法求解#include<bits/stdc++.h>#define MAXN 102#define MAXM 102using namespace std;int n,m,cost;int w[MAXN][MAXM];int c[MAXN][MAXM];int bestx[MAXN];int x[MAXN];int cw=0,cc=0;int bestw=9999;bool find(int i,int j){ for(int k=1;k<i;k++原创 2020-12-05 15:05:12 · 736 阅读 · 0 评论 -
分枝限界法求解迷宫问题
#include<stdio.h>#include<vector>#include<iostream>using namespace std;#define MAXQ 100#define INF 0x3f3f3f3f#define MAX_SIZE 21int H[4]={0,1,0,-1};int V[4]={-1,0,1,0};struct Position{ int x,y; Position(); Position(int i,int j原创 2020-12-03 20:15:26 · 584 阅读 · 0 评论 -
求解最小机器重量设计问题I
1.回溯法求解#include<bits/stdc++.h>#define MAXN 102#define MAXM 102using namespace std;int n,m,cost;int w[MAXN][MAXM];int c[MAXN][MAXM];int bestx[MAXN];int x[MAXN];int cw=0,cc=0;int bestw=9999;void dfs(int i){ if(i>n){ if(cw<bestw){原创 2020-12-03 19:54:58 · 332 阅读 · 0 评论 -
饥饿的小易,最少翻译个数
#include<iostream>#include<queue>const long MOD=1000000007L;using namespace std;struct NodeType{ long x; int num;};int bfs(long x0){ NodeType e,e1; if(x0<1||x0>1000000006L) return -1; x0%=MOD; queue<NodeType>qu; e.x=...原创 2020-12-03 19:28:53 · 399 阅读 · 0 评论 -
求解布线问题(自定义队列)
#include<stdio.h>#include<vector>#include<queue>#include<iostream>using namespace std;#define INF 0x3f3f3f#define MAXN 10#define MAXM 10#define MAXQ 101int H[4]={0,1,0,-1};int V[4]={-1,0,1,0};struct Position{ int x,y; P原创 2020-12-03 13:33:55 · 354 阅读 · 0 评论 -
求解任务分配问题
1.蛮力法#include<stdio.h>#include<vector>#include<iostream>using namespace std;#define INF 99999#define MAXN 21int n=4;int c[MAXN][MAXN]={{9,2,7,8},{6,4,3,7},{5,8,1,8},{7,6,9,4}};vector<vector<int> > ps;void Insert(vec原创 2020-12-02 21:23:24 · 1118 阅读 · 0 评论 -
分枝限界法
1.队列式分支限界法,普通BFS求解图的单源最短路问题#include<stdio.h>#include<string.h>#include<queue>#include<vector>using namespace std;#define INF 0x3f3f3f3f#define MAXN 51int n;int a[MAXN][MAXN];int v;int dist[MAXN];int prev[MAXN];struct原创 2020-12-01 15:40:01 · 283 阅读 · 0 评论 -
回溯法求解欧拉图与哈密顿图
1.欧拉图#include<bits/stdc++.h>using namespace std;const int MAX_V = 507; int graph[MAX_V][MAX_V];int n,m,a,b;int path[MAX_V];bool visited[MAX_V] = {0};void print(int path[]){ for (int i=0;i<n;i++) cout<<path[i]<<"->";原创 2020-11-23 15:32:41 · 257 阅读 · 0 评论 -
回溯法求解子集和问题
1.求子集和问题的解该问题的解空间树是一棵子集树。设解向量x=(x1,x2,…,xn),这里是求所有满足目标条件的解,所以一旦搜索到叶子结点(即i>n),如果相应的子集和为W,则输出x解向量。#include<stdio.h>#define MAXN 20int n=4,W=31;int w[]={0,11,13,24,7};int count=0;void dfs(int i,int tw,int rw,int x[]){ if(i>n){ if(tw==W原创 2020-11-22 12:44:03 · 4174 阅读 · 1 评论 -
回溯法求解图的着色和n皇后问题
1.图的着色问题图中的顶点标号1-n着色编号1-m对应的解空间树为m叉树(子集树),高度为n,从层次1开始时间复杂度m的n次方,空间复杂度n*m#include<stdio.h>#include<string.h>#define MAXN 20int n,k,m;int a[MAXN][MAXN];int x[MAXN];int count=0;void dispasolution(){ printf("第%d个着色方案:",count); for(int原创 2020-11-22 12:28:47 · 599 阅读 · 0 评论 -
求解任务分配问题
1.增量穷举法#include<stdio.h>#include<vector>using namespace std;#define INF 99999#define MAXN 21int n=4;int c[MAXN][MAXN]={{9,2,7,8},{6,4,3,7},{5,8,1,8},{7,6,9,4}};vector<vector<int> >ps;void Insert(vector<int>s,int i,ve原创 2020-11-22 11:28:27 · 455 阅读 · 0 评论 -
求解流水作业调度和活动安排问题
1.求N个作业的最优加工顺序,采用非优先调度。 POJ 2751采用回溯法求解(效率较低)对应的解空间是一个排列树,也就是求1-N的全排列使完成时间最少。选择不同的作业对应的方案也就不一样。f2是执行的总时间。#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f#define MAX 1001#define max(x,y) ((x)>(y)?(x):(y))int n=4;int a[MAX原创 2020-11-22 10:56:57 · 707 阅读 · 0 评论 -
求解一个整数数组划分成两个子数组问题
采用递归快速排序思想,时间复杂度为O(n)。#include<stdio.h>int Partition(int a[],int low,int high ){ int i=low,j=high; int povit=a[low]; while(i<j) { while(i<j&&a[j]>=povit) j--; a[i]=a[j]; while(i<j&&a[i]<=povit) i++; a[j]=a[原创 2020-11-21 17:52:24 · 2743 阅读 · 1 评论 -
求解查找假币问题
二分#include<stdio.h>#include<stdlib.h>#include<time.h>#define MAX 100int a[MAX];int n;int SUM(int low,int high){ int sum=0; for(int i=low;i<=high;i++){ sum+=a[i]; } return sum;}int solve(int low,int high){ if(low==high){原创 2020-11-21 17:39:05 · 4397 阅读 · 3 评论 -
求解钓鱼问题
#include<bits/stdc++.h>using namespace std;#define MAX 30int n=2;int h=1;int fi[MAX]={0,10,1};int di[MAX]={0,2,5};int ti[MAX]={0,2};int cfi[MAX];struct NodeType{ int num[MAX]; int max;}Lake[MAX];int maxlast;int GetMax(int p[],int i,int原创 2020-11-20 19:33:04 · 576 阅读 · 0 评论 -
推箱子
#include<queue>#include<string>#include<iostream>#include<bits/stdc++.h>using namespace std;int n,m;#define MAXN 10#define MAXM 10char map1[MAXN][MAXM];int H[4]={0,1,0,-1};int V[4]={-1,0,1,0};int vis[MAXN][MAXM][MAXN][MAX原创 2020-11-20 19:18:24 · 79 阅读 · 0 评论