给出一个自然数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";
}