题:给定两个整数a和b,这两个数的取值均在【-2000,2000】区间中。把对a进行一系列操作得到b的过程称为a到b的路径,可选操作包括:加12、减12、加7、减7、加5、减5。例如-5至19的的一条路径为(-5,7,19)。现要求编写程序,对任何a和b,求a至b的最短路径。

可以知道1有 5 5 5 -7 -7组成

f(1) = 5 5 5 -7 -7

求b-a的差值 c

n12 = c/12

n7 = c%12/7

n5 = c%12%7/5

最后剩下要组合的数就是1 -4之间的数了

因为我们之前都是按照先加大数的原则,所以在组合1-4之前,路径都是最短的

4*f(1)就会出现有8个-7,然后拿n12个12去抵消-7得5,这样就消去两个数,增加一个数,

上面的算法有错误:

可能出现的组合只能是

12,5(5的数量要小于12)

12,7(7的数量要小于12)

5 ,-7(-7的数量要小于5)

-5, 7(-5的数量要小于7,要么7个数小于5)

http://blog.csdn.net/gogdizzy/article/details/6563626

/**
* 用5,7,12加减运算,最少步骤到大n
* gogdizzy@gmail.com
*/
#include <stdio.h>
#define abs(x) /  ( (x^(x>>31))-(x>>31) )
int min_step( int N )
{  int diff;  int n5, n7, n12;  int r5, r7, r12;  unsigned tmp, total = unsigned (-1); // assign a very big num  for( n5 = -6; n5 < 7; ++n5 )  {  diff = N - 5 * n5;  n7 = diff / 7;  n12 = diff / 12;  if( 12 * n12 + 5 * n5 == N )  {  tmp = abs( n5 ) + abs( n12 );  if( total > tmp ) r5 = n5, r7 = 0, r12 = n12, total = tmp;  }  else if( 7 * n7 + 5 * n5 == N )  {  if( n7 > -12 && n7 < 12 )  {  tmp = abs( n5 ) + abs( n7 );  if( total > tmp ) r5 = n5, r7 = n7, r12 = 0, total = tmp;  }  }  }  for( n7 = -11; n7 < 12; ++n7 )  {  n12 = ( N - 7 * n7 ) / 12;  if( 7 * n7 + 12 * n12 == N )  {  tmp = abs( n7 ) + abs( n12 );  if( total > tmp ) r5 = 0, r7 = n7, r12 = n12, total = tmp;  }  }  printf( "%d = (%d) * 5 + (%d) * 7 + (%d) * 12/ntotal:%d/n", N, r5, r7, r12, total );  return total;
}
int main()
{  int n;  scanf( "%d", &n );  min_step( n );  return 0;
}  

两个数之间的最短路径问题相关推荐

  1. 利用函数求任意两个数之间的和

    利用函数求任意两个数之间的和 <!DOCTYPE html> <html lang="en"><head><meta charset=&q ...

  2. 判断两个数之间是否互质

    互质为求其最大公约数是否为1,如果为1的话之间互质. 任意两个不相等的质数互质. 经典欧几里得算法: private static boolean get(int n, int m) {//其函数为求 ...

  3. 微信小程序实现两个数之间的运算

    微信小程序实现两个数之间的运算 要求:创建一个微信小程序实现两个数字的比较运算.加法运算.减法运算.乘法运算或者除法运算中的一种,效果如图(这里我写的包含了所有运算,可根据需要自行选择): app.j ...

  4. C语言判断素数(求素数) 求两个数之间的所有质数

    求素数/质数(采用的sqrt) #include <stdio.h> #include<math.h>//判断一个数是不是素数 int checkPrimeNumber(int ...

  5. 计算任意两个数之间1出现的次数的思维过程

    1.我刚开始没有什么思路,仅仅是想到了将一个数字拆开成单个的数字,然后求一出现的次数,结果发现很难实现 2.没有思路,只能使用穷举法 穷举法c语言代码: #include <iostream&g ...

  6. python双素数_Python编程:筛法求两个数之间的素数

    要求计算最多10组,每组由两个数m,n构成(1<=m<=n<=1000000000,n-m<100000),要求打印出m,n之间的所有素数(包括m,n),时间限制6s.下面是我 ...

  7. Python不借助中间值实现两个数之间的交换

    在C.JAVA等语言中,不借助函数或类方法实现两个数的交换需要借助中间变量temp来完成,在Python中简化了定义中间变量这一过程便可直接进行两个变量数值间的交换,接下来将用C与Python分别进行 ...

  8. 求两个数之间的随机数及猜数字游戏

    思路:产生随机数的方法:Math.random() 然后套用公式:(1)不包括两个数在内 (Math.random()*(max-min))+min; function getRandom(min, ...

  9. 输出两个数之间的水仙花数C++

    代码如下(示例): #include<iostream> #include <math.h> using namespace std; int weishu(int n){in ...

最新文章

  1. 安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项
  2. numpy reshape resize用法
  3. 分布式系统——zabbix 用 onealert实现报警、agent主动模式、proxy代理
  4. php定时发送生日模块消息_RocketMQ消息队列介绍与应用
  5. 从零开始学前端:jQuery官网 --- 今天你学习了吗?(CSS:Day26)
  6. java左手握右手_在队列中,向中看齐举哪个手?
  7. And Design:拓荒笔记——Form表单
  8. Vue使用nextTick的原因和作用
  9. SQL NOTE--VIEW
  10. 【特征选择】特征选择的通俗讲解!
  11. HWSD土壤数据集下载及打开方法
  12. 定向寻宝亲子活动设计思路和实操(附2019最新教程)
  13. 2年修完6个清华CS硕士学位第3周反思报告
  14. python提示语法错误_python出现语法错误怎么办
  15. NLP标注工具:brat【可用于标注:实体、关系、事件、属性】【只能用于Linux下】【开源、免费】
  16. 零基础学前端之SEO 基础知识学习--SEO优化学习教程【学习笔记】
  17. python mpi4py multiprocessing_python基于multiprocessing的多进程创建方法
  18. 【Java Web基础】(五)实现新增下拉列表—由用户输入内容(Html+JS)
  19. 三维管廊大规模实时渲染方案
  20. 携手共进 冲量在线与宇信科技签署战略合作协议

热门文章

  1. 一、Go语言环境搭建
  2. 非递减数列JAVA_C语言实现两个递减数列中寻找某一个数
  3. 中国中文信息学会:第一届自然语言生成与智能写作大会讲习班正式发布
  4. 今日arXiv精选 | 15篇ICCV 2021最新论文
  5. 直播 | WWW 2021:基于结构增强文本表示学习的知识图谱补全方法
  6. CVPR 2019 | 旷视研究院提出Re-ID新方法VPM,优化局部成像下行人再识别
  7. CVPR 2019 | 全新缺失图像数据插补框架—CollaGAN
  8. 每天接触大量论文,看看他们是怎样写笔记的 | PaperDaily #09
  9. Non-local Neural Networks:非局部神经网络
  10. 邮件excel html,小数点分隔符在电子邮件(HTML/CSS)在Excel的VBA编程