
算法设计与分析
小新同学summer
既然选择了远方,便只顾风雨兼程。ᵎ(•̀㉨•́)و ̑̑
展开
-
gone fishing
go fishing#include<iostream>using namespace std;#define num 101int f[num]; //每个湖可以钓到的鱼的数量int d[num]; //每个胡每次减少的鱼的数量int p[num]; //每个胡钓鱼的次数int ti[num]; //相邻两个湖之间的时间int best = 0;void g...原创 2019-11-03 20:46:37 · 260 阅读 · 0 评论 -
0-1背包问题(回溯法解决)
0-1背包问题(回溯法解决)给定一个物品集合s={1,2,3,…,n},物品i的重量是wi,其价值是vi,背包的容量为W,即最大载重量不超过W。在限定的总重量W内,我们如何选择物品,才能使得物品的总价值最大。输入第一个数据是背包的容量为c(1≤c≤1500),第二个数据是物品的数量为n(1≤n≤50)。接下来n行是物品i的重量是wi,其价值为vi。所有的数据全部为整数,且保证输入数据中物品的...原创 2019-10-24 21:11:37 · 9136 阅读 · 0 评论 -
装载问题
装载问题问题描述:给定n个集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。集装箱装载问题要求确定在不超过轮船载重量的前提下,将尽可能多的集装箱装上轮船(贪心算法中的装载问题讨论的是装载件数;本题讨论的是最大装载重量。)问题分析:由于集装箱问题是从n个集装箱里选择一部分集装箱,假设解向量为X(x1, x2, …, xn),其中xi∈{0, 1}, xi =1表示集装箱i装上轮船,...原创 2019-10-23 20:31:20 · 1659 阅读 · 1 评论 -
过河问题
过河问题问题描述:有n个人要过一条河,每个人过河都需要一个时间,有一艘船,每次过河只能最多装两个人。两个人划船过河所需的时间都取决于过河时间长的那个人。比如,A,B两人过河所需时间分别为a,b,那么,他们成一条船过河所需的时间为:max{a,b}。现在让你安排一个过河方案,让所有人用最短的时间全部过河。输入:第一行给出人的数量//接下来的1行给出每个人的速度//4//1 2 5...原创 2019-10-19 20:37:36 · 1042 阅读 · 0 评论 -
均分纸牌
均分纸牌问题描述:有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。...原创 2019-10-19 20:16:45 · 204 阅读 · 0 评论 -
多处最优服务次序问题
多处最优服务次序问题设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,1≤i≤n,共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。输入第一行有2个正整数n和s,表示有n个顾客且有s处可以提供顾客需要的服务。接下来的1行中,有n个正整数,表...原创 2019-10-19 19:44:53 · 1277 阅读 · 0 评论 -
汽车加油问题
汽车加油问题问题描述:一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应哪些加油站停靠加油,使沿途加油次数最少。对于给定的n(n <= 5000)和k(k <= 1000)个加油站位置,编程计算最少加油次数。要求:输入:第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1...原创 2019-10-16 12:42:00 · 297 阅读 · 0 评论 -
删数问题
删数问题问题描述:给定n位正整数a,去掉其中任意k≤n个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案(顺序不改变)。输入第1行是1个正整数a,第2行是正整数k。输出对于给定的正整数a,编程计算删去k个数字后得到的最小数。大整数的表示的问题输入:字符串存储: 整数数组(或字符数组)贪心策略:...原创 2019-10-16 09:20:08 · 877 阅读 · 0 评论 -
贪心算法文字总结
贪心算法总是作出在当前看来最好的选择。贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。贪心算法和动态规划算法的比较:这两种算...原创 2019-10-15 20:53:09 · 462 阅读 · 0 评论 -
最长单调递增子序列
最长单调递增子序列问题描述:用数组b[0:i]记录以a[i] (0≤i<n) 为结尾元素的最长递增子序列的长度。序列a的最长递增子序列的长度为:max {b[i]}显然,b[i]满足最优子结构性质,可以递归的定义为:b[0] = 1;b[i] = max {b[k]} + 1即k在0~(i-1)范围内, 若a[k] ≤a[i], 寻找最大的b[k].据此将计算b[i]转化为i...原创 2019-10-15 20:32:59 · 488 阅读 · 0 评论 -
完全背包问题
完全背包问题问题描述设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。【样例输入】10 42 13 34 57 9【样例输出】 max=12...原创 2019-10-15 20:33:57 · 228 阅读 · 0 评论 -
最大子段和
最大子段和问题描述:给定由n个整数(包含负整数)组成的序列a1,a2,…,an,求该序列子段和的最大值。当所有整数均为负值时定义其最大子段和为0。所求的最优值为:例如,当(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)时,最大子段和为://最大子段和//蛮力法 三重循环 复杂性O(n3)#include<iostream>usi...原创 2019-10-13 15:58:42 · 283 阅读 · 0 评论 -
最长公共子序列
最长公共子序列关于公共子序列的描述:若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子...原创 2019-10-13 11:33:43 · 794 阅读 · 0 评论 -
取余运算
取余运算问题描述:输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整形数。【输入样例】mod.in2 10 9【输出样例】mod.out2^10 mod 9=7【算法分析】本题主要的难点在于数据规模很大(b,p都是长整型数),对于b^p显然不能死算,那样的话时间复杂度和编程复杂度都很大。//取余运算#include<iostream>#inc...原创 2019-10-07 13:06:14 · 1558 阅读 · 0 评论 -
阶乘函数
阶乘函数可递归地定义为:其中:n=0 时,n!=1为边界条件n>0 时,n!=n(n-1)!为递归方程边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。#include<iostream>using namespace std;int f(int n){ if (n == 1) return 1; el...原创 2019-09-16 20:28:34 · 4113 阅读 · 0 评论 -
Fibonacci数列 递归实现
Fibonacci数列无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为:第n个Fibonacci数可递归地计算如下:int fibonacci(int n){ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }#in...原创 2019-09-16 20:43:13 · 2042 阅读 · 0 评论 -
汉诺塔(Tower of Hanoi)问题
汉诺塔(Tower of Hanoi)问题#include<iostream>using namespace std;void move(char from, char to){ cout << "from " << from << " to " << to << endl;}void hanio(i...原创 2019-09-20 21:30:36 · 351 阅读 · 0 评论 -
猴子吃桃
猴子吃桃问题描述:猴子第一天采摘了一些桃子,第二天吃了第一天的一半多一个,第三天吃了第二天的一半多一个…直到第十天就剩下一个。问:猴子第一天摘了多少桃子?解析:递推关系:f(n)=f(n-1)/2-1f(n-1)=(f(n)+1)/*2f(10)=1#include <iostream>using namespace std;int func(int day){ ...原创 2019-09-21 21:06:56 · 185 阅读 · 0 评论 -
进制转化
进制转化描述:编写一个递归函数,将10进制转化成radix进制(输出二进制形式)除基数,取余数,结果倒排序void change(int x, int radix)x, 十进制数,radix, 基数根据除基数,取余数,结果倒排序的规则进行处理,直到商为0结束#include <iostream>using namespace std;void change(int a...原创 2019-09-21 21:10:33 · 305 阅读 · 0 评论 -
逆序输出
逆序输出逆序输出一个正数中的每一位数例如,对于数12345,依次输出5 4 3 2 1分析:如果n/10==0,则输出n;否则输出n%10,然后,对n/10进行相同处理void Reverse( int n){ if(n/10==0) cout<<n; else{ cout<<n%10; Reverse(n/10); }...原创 2019-09-21 21:25:34 · 4080 阅读 · 0 评论 -
正序输出
正序输出依次输出一个数中的每一位数例如,对于数12345,依次输出1 2 3 4 5分析:如果n/10==0,则输出n;否则先对n/10进行相同处理之后,cout<<n%10;void Reverse( int n){ if(n/10==0) cout<<n; else{ Reverse(n/10); cout<<...原创 2019-09-21 21:38:17 · 790 阅读 · 0 评论 -
集合全排列
集合全排列设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列(n!种)。设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中元素的全排列记为perm(X)。(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:当n=1时,perm®=®,其中r是集合R中唯一的元素;当n>1时,pe...原创 2019-09-21 21:50:20 · 973 阅读 · 0 评论 -
整数划分问题
整数划分问题将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。例如正整数6有如下11种不同的划分:6;5+1;4+2,4+1+1;3+3,3+2+1,3+1+1+1;2+2+2,2+2+1+1,2+1+1+1+1;1+1+1+1+1+1。整数6的划分方法数 =最大...原创 2019-09-21 21:57:10 · 2617 阅读 · 0 评论 -
循环赛日程表
循环赛日程表循环赛日程表问题,设有n=2k个选手要进行循环赛,设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天。#include <iostream>using namespace std;#define MAX 100int a[MAX][MAX];void Copy(int tox, i...原创 2019-09-21 22:06:55 · 926 阅读 · 0 评论 -
棋盘覆盖问题
棋盘覆盖问题问题描述:在一个2k×2k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。覆盖任意一个2k×2k的特殊棋盘,用到的骨牌数恰好为(4K-1)/3。问题:对于给定的特殊棋盘,设计棋盘覆盖方案例如:输入:...原创 2019-09-24 09:14:57 · 1132 阅读 · 0 评论 -
选择问题 -线性时间选择
选择问题 -线性时间选择问题描述:元素选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。线性时间选择算法:模仿快速排序算法,首先对输入数组进行划分,然后对划分出的子数组之一进行递归处理。对于给定的n个元素的数组a[0:n—1],要求从中找出第k小的元素。输入;输入有多组测试例。对每一个测试例有2行,第一行是整数n和k(1≤k<n≤1000...原创 2019-10-06 12:31:29 · 1592 阅读 · 2 评论 -
输油管道问题
输油管道问题问题描述:某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?给定n口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。输入第...原创 2019-10-06 12:36:22 · 387 阅读 · 0 评论 -
半数集问题
半数集问题问题描述:要求找出具有下列性质的数的个数(包含输入的自然数n):先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超过原数字的一半;3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.如输入6,则有6162612636136//半数集问题#include<...原创 2019-10-07 13:01:22 · 212 阅读 · 0 评论 -
整数因子分解
整数因子分解问题描述:大于1的正整数n可以分解为:当n=12时,共有8种不同的分解式:对于给定的正整数n,编程计算n共有多少种不同的分解式。//整数因子分解#include<iostream>using namespace std;int total;void solve(int n){ if (n == 1) total++; //获得一个分解 el...原创 2019-10-07 13:03:31 · 456 阅读 · 0 评论 -
Fibonacci 数列
Fibonacci原创 2019-09-07 01:13:34 · 190 阅读 · 0 评论