计算机算法分析与设计
BJRSR
这个作者很懒,什么都没留下…
展开
-
31. 下一个排列 python
规律:一个nums 列表分为前半部分和后半部分,后半部分是递增数组, 前半部分为非递减,关键是找数组里的两个下标, middle和 right。middle代表从nums从尾部往前非递减序列的头, right代表递增序列里比nums[middle- 1]大的最小的元素,把a[0]到a[middle- 1]称作前半部分数,把a[middle]到a[n]称作后半部分数,然后交换a[middle- 1]和a[right],就保障了 新的前半部分数是比之前的前半部分数大的数里面的最小的,因为只...原创 2021-08-10 20:54:02 · 179 阅读 · 0 评论 -
旅行商问题(Tsp)动态规划
参考:TSP问题,动态规划法#include<iostream>#include<vector>#include<iomanip>using namespace std;int n,m;vector<vector<int>>dp;#define INF 10e7#define N 5int g[N][N] ={ {0,3,INF,8,9}, {3,0,3,10,5}, {I...原创 2020-11-12 18:10:49 · 725 阅读 · 0 评论 -
n-皇后问题
1.算法描述在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?#include<iostream>#include<vector>#include<math.h>using namespace std;int n;vector<int>x;//x[i]代表第i个皇后的位置void visit();//判断第k个数与前k-1个数的位置比较,成功进入下一层,失败重.原创 2020-11-12 17:27:49 · 173 阅读 · 0 评论 -
01-背包问题(回溯法)
0-1背包问题,用回溯和剪枝。输入:n c ,n为物品数量,c为背包容量。接下来每行都是v[i],w[i]求背包容量下的最大的物品价值总和?#include<iostream>#include<vector>using namespace std;int n, c,bestv;vector<int>x;vector<int>bestx;//枚举void backtrace(vector<int>& v, v.原创 2020-11-12 13:43:58 · 189 阅读 · 0 评论 -
轮船载重问题(回溯法)
载重问题:回溯法(子集树)题目:有2辆轮船,承载量分别是:c1和c2,有n个货物,重量为v[i],i=(1:n),且∑v[i]<=c1+c2,求两条船最大的承重梁?#include<iostream>#include<vector>using namespace std;int bestw,n,rw;void backtrack(vector<int>& v, int c1,int cw,int t){ if (t > n...原创 2020-11-12 12:37:27 · 436 阅读 · 0 评论 -
选课问题 (动态规划)
转载:C++剑指offer:树形DP之树上的有依赖性的背包问题——选课题目描述学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。 学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的。学生选修了这M门课并考核通过就能获得相应的学分。 在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如《Frontpage》必须在选修了《Windows 操作基础》之后才能选修。我们称《Windows 操作基础》是《转载 2020-10-31 11:26:40 · 2197 阅读 · 0 评论 -
多元哈弗曼编码问题
问题描述:在一个操场的四周摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次至少选2堆至多选k堆石子合并成新的一堆,合并的费用为新的一堆石子数。计算出将n堆石子合并成一堆的最大总费用和最小总费用。算法设计:对于给定的n堆石子,计算合并成一堆的最大总费用和最小总费用。数据输入:文件的第1行有2个正整数n和k,表示有n堆石子,每次至少选2堆至多选k堆石子合并。第2行有n个数,分别表示每堆石子的个数。输入示例:7 345 13 12 16 9 5 22输出示例:593 199思路:用最.原创 2020-10-29 21:15:02 · 235 阅读 · 0 评论 -
石子问题
问题:一个操场的四周摆放着n堆石子,每次把两个相邻的两堆石子合并起来,最后合并成一堆,每次搬动就要花费力气,力气的代价是两堆石子的数量之和,问:如何使总的花费的力气最小。(并非贪心)方法:动态规划#include<iostream>#include<vector>#include<algorithm>#include<cmath>using namespace std;vector<vector<int>>m;i.原创 2020-10-29 19:40:35 · 163 阅读 · 0 评论 -
汽车加油问题(贪心算法)
1.问题描述:一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。算法设计:对于给定的n和k个加油站位置,计算最少加油次数。数据输入:n:表示汽车加满油后可行驶nkmk:旅途中有k个加油站k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。数据输出:最少加油次数和具体在哪几个加油站加油。例如:n=7 ...原创 2020-10-29 16:46:43 · 1238 阅读 · 0 评论 -
贪心算法 多机调度
思想:采用小顶堆,每台机器一有空,就从工作中挑选一个工作时间最长的。#include<iostream>#include<vector>#include<queue>using namespace std;class MechineNode{public: MechineNode(int id, int start, int JobId = 0) { this->ID = id; this->start = start; t.原创 2020-10-28 23:06:47 · 352 阅读 · 0 评论 -
分组背包问题
问题:有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 Ci,价值是 Wi。这些 物品被划分为 K 组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包 可使这些物品的费用总和不超过背包容量,且价值总和最大。 我用的是二维数组,这是种没有优化的。(小白写的)#include<iostream>#include<vector>#include<iomanip>using namespace std;void vis.原创 2020-10-12 19:28:56 · 99 阅读 · 0 评论 -
压状dp
P1433 吃奶酪(洛谷)状压dp解法嗯?这题竟然是个绿题。这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点……我们直接套公式去求出需要的值,然后普通的状压dp就可以了。是的状压dp。这个题的数据加强了,早已经不是搜索可以驾驭的了。搜索的效率实在是有点低,我来算一个不准的效率,搜索的效率应该是O(n!)。应该是吧。状压dp只需要短短的O(2^n*n*n就可以了)。状态共有2^n*n个,每次查找下一步需要O(n)的效率,所以状压dp的效率是O(2转载 2020-10-09 17:45:36 · 125 阅读 · 0 评论 -
0_1背包问题
解决办法:声明一个 大小为 m[n][c] 的二维数组,m[ i ][ j ] 表示 在面对第 i 件物品,且背包容量为 j 时所能获得的最大价值,那么我们可以很容易分析得出 m[i][j] 的计算方法,(1). j < w[i] 的情况,这时候背包容量不足以放下第 i 件物品,只能选择不拿 m[ i ][ j ] = m[ i-1 ][ j ](2). j>=w[i] 的情况,这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值。如果拿取,m[ i ][.转载 2020-10-09 12:01:13 · 82 阅读 · 0 评论 -
最大字段和
题意:给定n个整数(可能为负整数)组成的序列a1,a2.......an,求该序列子段和的最大值(子段必须连续),当所有整数为负整数定义其最大子段之和为0.方法一:暴力 O(n^2)#include<iostream>#include<vector>using namespace std;int pd(int arr[], int n,int &best_i,int &best_j){ int sum, tmp; sum = 0; tmp .原创 2020-10-09 10:39:12 · 136 阅读 · 0 评论 -
最长公共子序列
#include<iostream>#include<vector>#include<string>#include<iomanip>using namespace std;vector<vector<int>>b;int dp(vector<vector<int>>&b,string &x1, string &x2){ int m, n; m=x1.length();.原创 2020-10-08 17:25:22 · 62 阅读 · 0 评论 -
矩阵连乘
dp:#include<iostream>#include<vector>#include <climits>#include <cfloat>#include<iomanip>using namespace std;void dp(vector<vector<int>>& m, vector<vector<int>>& s,vector<int>&am.原创 2020-10-08 11:28:52 · 87 阅读 · 0 评论