算法设计与分析
洛熙熙
这个作者很懒,什么都没留下…
展开
-
分数背包问题——贪心算法
分析:背包问题用贪心法解决,首先就是计算每个物品的性价比(价格/重量),然后进行排序,先装性价比高的物品再依次装入性价比第二、三......高的,如果背包剩余量小于物品的重量,则可以将物品进行拆分,将部分物品装进背包中。原创 2021-12-22 09:25:14 · 1994 阅读 · 0 评论 -
会场安排问题——贪心算法
问题描述: 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的 。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)编程任务: 对于给定的k 个待安排的活动,编程计算使用最少会场的时间表。数据输入: 由文件input.txt 给出输入数据。第一行有1 个正整数k,表示有k 个待安排的活动。接下来的k 行中,每行有2 个正整数,分别表示k 个待安排的活原创 2021-12-20 15:11:53 · 997 阅读 · 0 评论 -
整数因子分解
问题描述: 大于1 的正整数n 可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8 种不同的分解式:12=12;12=6*2;12=4*3;12=3*4;12=3*2*2;12=2*6;12=2*3*2;12=2*2*3 。编程任务: 对于给定的正整数n,编程计算n 共有多少种不同的分解式。数据输入: 由文件input.txt 给出输入数据。第一行有1 个正整数n (1≤n≤2000000000)。结果输出:将计算出的不同的原创 2021-12-20 10:01:20 · 335 阅读 · 0 评论 -
集合划分问题
问题描述: n 个元素的集合{1,2,., n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2, 3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}},{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}原创 2021-12-20 09:28:59 · 1341 阅读 · 0 评论 -
邮局选址问题——分治法
问题描述: 在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y 坐标表示南北向。各居民点的位置可以由坐标(x,y) 表示。街区中任意2 点(x1,y1) 和(x2,y2) 之间的距离可以用数值|x1-x2|+|y1-y2| 度量。居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小。编程任务: 给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。数据输入: 由文件input.原创 2021-12-20 08:51:07 · 4940 阅读 · 2 评论 -
众数问题——分治法
给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S 的众数是2,其重数为3。编程任务: 对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。数据输入: 输入数据由文件名为input.txt 的文本文件提供。文件的第1 行多重集S 中元素个数n;接下来的n 行中,每行有一个自然数。结果输出: 程序运行结束时,将计算结果输出到文件output.txt原创 2021-12-20 08:00:29 · 3583 阅读 · 1 评论 -
算法设计与分析——最长公共子序列
运用了动态规划原理代码如下:#include<bits/stdc++.h>using namespace std;int main(){ int L[100][100]; char a[5]={'B','D','C','A'}; char b[5]={'A','B','C','B'}; for(int i=0;i<=4;i++) { L[i][0]=0; } for(int i=0;i<=4;i原创 2021-12-11 20:36:55 · 408 阅读 · 0 评论 -
算法设计与分析——快速排序
“划分算法”基本思想设A[low..high]是一个包含n个数的数组,并且x=A[low] 我们考虑重新安排数组A中的元素的问题,使得小于或等于x的元素在x的前面,随后x又在所有大于它的元素的前面 经过数组中元素改变排列后,对于某个w,low≤w≤high,x在A[w] 中。而快速排序则应用了划分算法来重新排列元素代码如下:#include<bits/stdc++.h>using namespace std;int n;int split(int a[],in.原创 2021-12-10 08:01:51 · 654 阅读 · 0 评论 -
算法设计与分析——并查集
并查集:在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。其中最重要的函数find函数(利用递归寻找根节点)int find(int x){ if(p[x]!=x) { p[x]=find(p[x]); } return p[x];}例题:题目描述一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m原创 2021-12-09 08:42:31 · 192 阅读 · 2 评论 -
算法设计与分析——逆序对计数
逆序对:当i<j时,A[i] > A[j] 的二元组(A[i] ,A[j])。算法流程:①把数组分为两个子数组A[1...n/2]和A[n/2+1...n]。②求解S1:仅在A[1...n/2]中的逆序对数目。 求解S2:仅在A[n/2+1...n]中的逆序对数目。③求解S3:跨越子数组的逆序对数目(用归并求解,只是在归并排序的基础上加了一个 S3=S3+mid-i+1)。④S=S1+S2+S3。#include<bits/stdc++.h...原创 2021-12-09 07:50:42 · 1297 阅读 · 0 评论 -
算法设计与分析——最大子数组
算法流程:①将数组x[1...n]分为x[1...n/2]和x[n/2+1...n]②递归求解子问题 S1:数组x[1...n/2]的最大子数组。 S2:数组x[n/2+1...n]的最大子数组。③合并子问题,得到Smax S3: 跨中点的最大子数组。 Smax=max{S1,S2,S3}原创 2021-12-08 18:26:05 · 389 阅读 · 0 评论 -
算法设计与分析——归并排序
算法流程:①将数组[1,n]排序问题分解为[1,n/2]和[n/2+1,n]排序问题。②递归解决子问题得到两个有序的子数组。③将两个有序子数组合并为一个有序数组。代码如下:#include<bits/stdc++.h>using namespace std;int n;void merge(int a[],int left,int mid,int right){ int i=left,j=mid+1,k=0; int b[100]; for原创 2021-12-05 14:10:03 · 209 阅读 · 0 评论