编程之美最短路径
Posted 程序员互动联盟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程之美最短路径相关的知识,希望对你有一定的参考价值。
最短路径
任意给定两个数字A和B,通过将A和6个数(7,-7,5,-5,12,-12)做加减运算,运算次数不限,每个数可以被使用多次,求从A到B最少要经过多少次运算?
比如:A=0, B=19,从A到B的一条路径为{0,7,19},经过2次运算得到。{0, 5, 12,19}也是符合要求的一条路径,但是需要经过3次运算才可以得到。所以最少要经过2次运算才可以实现从0到19.
解题思路:
方案一:DP从A到B,可以简化为从0到abs(A-B)
设S[i]为从0到i的最短路径
那么 S[i]=min(S[v]+S[i-v])
方案二:限制条件: det=12a+7b+5c
目标函数: S=|a|+|b|+|c|
a,b,c若有一个以上为0,则变成二元整数线性规划的问题,好像是经典问题,易解。
如果三者都不为零,则:
如果b,c同号,则一个(7+5)用一个12代替,可以得到更优解
如果b,c异号,则其中必有一个与a异号,(12-7)用5代替,或(12-5)用7代替,可以得到更优解
综上,最优解中,a,b,c肯定至少有一个为0
所以分别做3次二元线性规划,取最优的即可
方案三:题意中的12,-12完全没意义,因为可以用(7,5) (-7,-5)代替。
因此只需要考虑(7,-7,5,-5)。
A + (7x+5y) = B -> 7x+5y=(B-A)
ax+by=d
然后扩展欧几里得算法。
code也是一种艺术,它能展现出自己的美。
以上是关于编程之美最短路径的主要内容,如果未能解决你的问题,请参考以下文章