前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编程之美】最短路径

【编程之美】最短路径

作者头像
程序员互动联盟
发布2018-03-15 16:22:35
8470
发布2018-03-15 16:22:35
举报
最短路径

任意给定两个数字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.

01

class

解题思路:

方案一: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也是一种艺术,它能展现出自己的美。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档