某公司算法面试题目浅析

给出一个自然数N,定义其路径为若干个(可以为0)5,7,12之和,路径长度为5,7,12的个数,比如说 17 = 5+5+7 则17的路径长度为3;还可以分解为17=5+12,则17的路径为2.

求给定自然数N的最短路径,如果没有,则返回0.



其实,这不算一个很复杂的题目,我们只要进行一下简单的分析,就能发现其中的窍门所在。

假设已经找到了最短路径的分配方式为 N = 12 * a + 7 * b + 5 * c,则a,b,c分别有什么规律?

首先分析c,可以断定 c<7,为什么?假设c>7,则可分解为 N = 12 *a + 7 *(b+1) + 5 *(c-7),路径从a+b+c变为 a+b-6,这与a+b+c已经是最短路径相矛盾。


下面分析b,可以断定b<12,为什么?道理跟上面一样,自己分析下。


这样分析下来,就有了基本的解题思路。

由于 b>=0 && b < 12  c>=0 && c < 7,则可以遍历b,c的所有组合,如果N - 7 * b + 5 * c 模 12为0,则说明N可以被分解。


算法如下


 

 

bool bFound = false;

int a, b, c;

for(   a = iNum / 12 ; a >=0; --a )

{

for(   b = 6; b>= 0; --b )//这里需要注意,从大到小遍历,这样优先得到最短路径

{

for(   c = 11; c >= 0; --c)

{

if( a * 12 + b * 7 + c * 5 == iNum )

{

bFound = true;

break;

}

}

if( bFound )

break;

}

if( bFound )

break;

}


if( bFound )

{

cout << m << "* 12 + " << k << "* 7 + " << n <<"* 5 = " << m*12+k*7+n*5 << "/n";

}

else

{cout << "can't find!/n";

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值