引言
引言的作用就是引出为什么要写这篇文章,主下几个方面:
(1)局部问题解决不了,因为当你一直选取汇率大的或者汇率小的转都不一定能转成最优。因此,这是涉及枚举所有情况的问题。即每次选择会和之前选择的情况相关,因此不能以一种固定的策略进行;
(2)考虑通项,从目标值而言,很明显是第i种货币转换成第j种货币的最优情况;
(3)套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。
数学模型
假设已知n种货币a,b,c,...h,其之间的兑换率构成矩阵如下; R=(r)n*n,r[i][j]表示一个货币单位c可以买到的金币c的单位数,且r=1(i=1,2,3..,n)套汇问题就是找出一个货币序列a,b,...,h;使得
r[1][2]r[2][3]..>1
对等式俩边取对数,得到:
Inr[1][2]+Inr[2][3]+...+Inr[k][1]>0
假设有n个顶点的有向图,顶点由货币a,b,
- ...,h,组成,顶点之间的权值为w,令
W[i][j]=—Inr(i j=1,2,...,n)
则
W[1][2]+W[2][3]...+W[k][1]<0
因此套汇问题就变成找出一个负回路a,b,..h,即使w[1][2]+w[2][3]+...+w[k][1]<0
1 算法设计(Floyd算法)
-
- 算法描述
这整一道题下来,首先最先的思路就是希望构造一个图,然后通过深度搜索DFS,将每一条边的权值都乘起来,最后再乘回终点与起点的权值,若大于1,则说明是一个正环,并且套汇成功,直接输出YES。
深度搜索的方法固然可以得出答案,但是若是点很多,遍历的顺序无法确定。举个例子,假设只存在一个正环,若遍历的点很多,可能要耗费很长的时间,最后遍历到那个环,最后输出yes,最后同样能得出正确答案,但是并不是最佳解法。
Floyd算法,这道题就变得简单起来,只要判断最后的对角线是否