
算法设计与分析
DrmBee#
如有问题,随时提问。
展开
-
求解活动安排问题
问题描述:假设有一个需要使用某一资源的由n个活动所组成的集合S,S=(1,…,n)。该资源在任何时刻只能被一个活动所占用,活动i有一个开始时间bi和结束时间ei(bi<ei),其执行时间为ei-bi,假设最早活动执行时间为0。一旦某个活动开始执行,就不能被打断,直到其执行完毕。若活动i和活动j有bi≥ej或bj≥ei,则称这两个活动兼容。设计一种最优活动安排方案,使得所有安排的活动个数最多。问题求解:采用贪心算法的策略是每一步总是选择这样一个活动来占用资源,它能够使得余下的未调度的时间最大化,使原创 2020-11-16 20:19:16 · 2630 阅读 · 0 评论 -
求第k小数(快排)noj
#include <iostream> using namespace std; int n,k;int a[10000]; int findk(int st,int ed, int k); int main(){ cin>>n; for(int i=0; i<n; i++) { cin>>a[i]; } cin>>k; cout<<findk(0, n.原创 2020-11-01 17:31:24 · 224 阅读 · 0 评论 -
循环赛日程表(分治)noj
#include<iostream>using namespace std;int n;int a[10000][10000];void search(int st,int length);//分治void filltable(int st,int length);//对角填充 左上填右下 左下填右上 int main(){ int i,j,length; cin>>n; length=1; for(i=0;i<n;i++) { lengt.原创 2020-11-01 17:11:47 · 283 阅读 · 0 评论 -
穷举n位二进制数(深搜)noj
#include<iostream>using namespace std;int n;int a[20];void dfs(int m);int main() { cin>>n; dfs(0); return 0;}void dfs(int m){ int i; if(m==n) { for(i=0;i<m;i++) cout<<a[i]; cout<<endl; } else {.原创 2020-11-01 16:14:16 · 225 阅读 · 0 评论 -
走迷宫(深搜)noj
#include<iostream>using namespace std;int m,n;int sx,sy;int tx,ty;int maze[20][20];int walk[4][2]={ -1,0,//左 0,1,//上 0,-1,//下 1,0,//右 }; void dfs(int x,int y);bool canmoveto(int x,int y,int i);int main(){ int i,j; cin>&.原创 2020-10-31 23:00:59 · 324 阅读 · 0 评论 -
八数码问题(广搜)noj
Picture1Picture2Picture3Picture4Picture5#include<iostream>#include<map>#include<queue>using namespace std;map<int, int>smap; //记录步数和标记是否是已到达的结点。queue<int>q1; int bs[3][3],a[3][3];int isdate;//0, 1, 2, 3分别原创 2020-10-31 22:19:36 · 430 阅读 · 0 评论 -
独轮车(广搜)noj
#include <iostream>#include <queue>using namespace std;int sx,sy;char sc,sd;int tx,ty;char tc;char maze[20][20];struct node{ int x; int y; int color; //颜色,0-R-红,1-Y-黄,2-B-蓝,3-W-白,4-G-绿 int dire; //方向:0-E-东,1-S-南,...原创 2020-10-31 20:11:14 · 378 阅读 · 0 评论 -
六数码问题(广搜)noj
在C语言中,或更精确地说成C标准函数库中表示文件结束符。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。而cin是C++ 中的标准输入流。https:/..原创 2020-10-31 15:16:17 · 507 阅读 · 0 评论 -
电子老鼠闯迷宫(广搜)noj
#include<iostream>#include<queue>using namespace std;#define true 1#define false 0#define MAXN 1000char maze[12][12];//游戏背景图int used[MAXN][MAXN];//记录某点是否走过int step[MAXN][MAXN];//记录走过的步数struct node{ int x; int y;};node star..原创 2020-10-25 15:28:04 · 1191 阅读 · 4 评论 -
加1乘2平方(广搜)noj
#include<iostream>#include<queue>#include<string.h>#define MAXN 10000#define true 1#define false 0using namespace std;queue<int>q1;int m,n;int used[MAXN];int step[MAXN];int dfs();int change(int now,int i);int isTarge..原创 2020-10-25 15:01:24 · 384 阅读 · 0 评论 -
图的m着色问题noj
#include<stdio.h>#include<string.h>#define MAXN 1000#define true 1#define false 0int n,r,m;//n个顶点,r条边,m种颜色int a[MAXN][MAXN];//邻接矩阵int count=0;//累计解的个数int x[MAXN];//x[i]表示顶点i的着色void dfs(int i);int Same(int i);int main(){ int .原创 2020-10-24 20:50:32 · 281 阅读 · 0 评论 -
图的m着色问题
/*给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。*/#include<stdio.h>#include<string.h>#define MAXN 100#define true 1#define false 0int n,k,m;//n个顶点,k条边,m种颜色int a[MAXN][MAX原创 2020-10-24 20:14:33 · 622 阅读 · 0 评论 -
n皇后问题
从中总结出n皇后求解的规则:①用数组q[]存放皇后的位置,q[k]表示第k个皇后放置的位置,n皇后问题的一个解是: q[1],q[2],…,q[n],数组q的下标0元素不用。②先放置第1个皇后,然后依2、3、…、n的次序放置其他皇后,当第n个皇后放置好后产生一个解。为了找所有解,此时算法还不能结束,继续试探第n个皇后的下一个位置。③第k(k<n)个皇后放置后,接着放置第k+1个皇后,在试探第k+1个皇后的位置时,都是从第1列开始的。④当第k个皇后试探了所有列都不能放置时,则回溯到第k-1个皇.原创 2020-10-24 18:58:32 · 455 阅读 · 0 评论 -
求解装载问题(深搜)noj
1、求解简单装载问题#include<stdio.h>#include<string.h>#define MAXN 50int W;//载重量为Wint n;//n个集装箱int w[MAXN];int X[MAXN];//存放最优解int maxw=0;void dfs(int i,int tw,int rw,int op[]);void output();//i表示第i个集装箱,tw表示选择的集装箱的重量和,rw表示剩余集装箱的重量和//op表示一个方原创 2020-10-24 17:28:10 · 1937 阅读 · 0 评论 -
穷举所有排列noj
#include<iostream>#define MAXN 10using namespace std;void swap(char &x,char &y);void dispasolution(char a[],int n);void dfs(char a[],int n,int i);int main(){ char a[MAXN]; int n; int i; cin>>n; for(i=0;i<.原创 2020-10-16 19:24:35 · 359 阅读 · 0 评论 -
素数环问题
#include<iostream>#include<stdlib.h>#define FALSE 0#define TRUE 1using namespace std;int g_a[21]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};int isprime(int x);void set(int place);void output();void swap(int place,int i);原创 2020-10-09 21:12:33 · 1230 阅读 · 0 评论 -
求解0/1背包问题(深搜)noj
装入背包中物品重量和恰好为W#include<stdio.h>#define MAXN 20int W=6;int n=4;//4种物品int w[]={0,5,3,2,1};int v[]={0,4,4,3,1};int X[MAXN];int max=0;void dfs(int i,int tw,int tv,int *op);void Output();int main(){ int op[MAXN]; dfs(1,0,0,op); Out原创 2020-10-08 22:11:24 · 524 阅读 · 0 评论 -
计算a的全排列(解空间为排列树)
#include<iostream>using namespace std;void swap(int &x,int &y);void dispasolution(int a[],int n);void dfs(int a[],int n,int i);int main(){ int a[]={1,2,3}; int n=sizeof(a)/sizeof(a[0]); cout<<"a的全排列"<<endl;原创 2020-10-08 20:09:57 · 1111 阅读 · 3 评论 -
产生值100(递归回溯法)
设计一个算法在1、2、…、9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1+2+34-5+67-8+9=100#include<stdio.h>#include<string.h>#define N 9void AddFun(char *op,int sum,int prevadd,int *a,int i);int main(){ int a[N]; int i; char op[N]原创 2020-10-08 19:50:27 · 359 阅读 · 0 评论 -
求一个集合的幂集(递归回溯法)
#include<stdio.h>#include<string.h>#define MAXN 100void dfs(int *a,int n,int i,int *x);void Output(int *a,int n,int *x);int main(){ int a[]={1,2,3}; int n=sizeof(a)/sizeof(a[0]); int x[MAXN]; memset(x,0,sizeof(x)); pr原创 2020-10-08 16:36:08 · 1183 阅读 · 0 评论 -
象棋算式
1、非递归回溯法#include<stdio.h>#include<string.h>int main(){ bool dig[10]; int a,b,c,d,e,m,n,s; memset(dig,0,sizeof(dig)); for(a=1;a<=9;a++){//兵 dig[a]=1; for(b=0;b<=9;b++){//炮 if(!dig[b]){原创 2020-10-08 16:23:16 · 394 阅读 · 0 评论 -
快速排序noj
#include<stdio.h>#define MAXSIZE 10000void QuickSort(int a[],int lo,int hi);int Partition(int a[],int lo,int hi);void swap(int a[],int b,int c);void Output(int a[],int n);int main(){ int n;//输入元素的个数 int a[MAXSIZE]; int i; sc..原创 2020-10-08 13:40:03 · 403 阅读 · 0 评论 -
归并排序noj
#include<stdio.h>#include<malloc.h>#define MAXSIZE 10000void MergeSort1(int a[],int n);void MergePass(int a[],int length,int n);void Merge(int *a,int low,int mid,int high);void output(int a[],int n);int main(){ int a[MAXSIZE]; .原创 2020-10-08 13:35:12 · 295 阅读 · 0 评论 -
二分查找noj
#include<stdio.h>#define MAXSIZE 50000#define TRUE 1#define FALSE 0int Search(int *a,int low,int high,int b);int main(){ int n; int i=0; int a[MAXSIZE],b[MAXSIZE]; int m,t; scanf("%d",&n); for(i=0;i<n;i++){ .原创 2020-10-08 13:24:38 · 392 阅读 · 0 评论 -
快速排序
#include<stdio.h>#define MAXSIZE 20void QuickSort(int a[],int lo,int hi);int Partition(int a[],int lo,int hi);void swap(int a[],int b,int c);void Output(int a[],int n);int main(){ int n;//输入元素的个数 int a[MAXSIZE]; int i; scanf("%原创 2020-09-22 21:14:25 · 89 阅读 · 0 评论