开发者

how to optimise this code?

I have a solution to the below problem in PHP. But it is taking too much time to execute for 10 digit numbers. I want to know where am I going wrong ? I am new to dynamic programming .Can someone have a look at this ?

Problem

In Byteland they have a very strange monetary system.

Each Bytelandian gold coin has an integer number written on it. A coin n can be exchanged in a bank into three coins: n/2, n/3 and n/4. But these numbers are all rounded down (the banks have to make a profit).

You can also sell Bytelandian coins for American dollars. The exchange rate is 1:1. But you can not buy Bytelandian coins.

You have one gold coin. What is the maximum amount of American dollars you can get for it?

========================================================

<?php 
$maxA=array();

function exchange($money)
{
        if($money == 0)
        {
               return $money;
        }
        if(isset($maxA[$money]))
        {
                $temp = $maxA[$money]; // gets the maximum dollars for N
        }
        else
        {
           $temp = 0;
        }
        if($temp == 0)
        {
            $m = $money/2;
    开发者_开发百科        $m = floor($m);
            $o = $money/3;
            $o = floor($o);
            $n = $money/4;
            $n = floor($n);
            $total = $m+$n+$o;

       if(isset($maxA[$m]))
        {
             $m = $maxA[$m];

        }
        else
        {
           $m = exchange($m);
        }
        if(isset($maxA[$n]))
        {
         $n = $maxA[$n];
        }
        else
        {
           $n = exchange($n);
        }
        if(isset($maxA[$o]))
        {
           $o = $maxA[$o];
        }
        else
        {
           $o = exchange($o);
        }

       $temp = max($total,$m+$n+$o,$money);
       $maxA[$money]=$temp;  //store the value
        }

return $temp; 
}

$A=array();
while(1)
{
      $handle = fopen ("php://stdin","r");
      $line = fgets($handle);
      if(feof($handle))
      {
          break;
      }
      array_push($A,trim($line));
}

$count =count($A);
for($i=0;$i<$count;$i++)
{
      $val = exchange($A[$i]);
      print "$val \n";
 }
?>


Here a reformatted version of the code for the ones (like I) who could understand the above. It doesn't improve anything.

function exchange($money) {
    static $maxA = array(0 => 0);

    if (isset($maxA[$money])) {
        return $money;
    }

    $m = floor($money/2);
    $o = floor($money/3);
    $n = floor($money/4);
    $total = $m+$n+$o;

    if (isset($maxA[$m])) {
        $m = $maxA[$m];
    } else {
        $m = exchange($m);
    }

    if (isset($maxA[$n])) {
        $n = $maxA[$n];
    } else {
        $n = exchange($n);
    }
    if (isset($maxA[$o])) {
        $o = $maxA[$o];
    } else {
        $o = exchange($o);
    }

    return $maxA[$money] = max($total, $m + $n + $o, $money);
}


I still have my code from this problem. But it's in c++. It's by no means the most efficient, but it passed. It might not be too hard to port to php.


#include <cstdio>
#include <queue>
using namespace std;

unsigned long results;
queue to_test;

int main()
{
  char tmp_val[30];
  unsigned long coin_value = 1;
  while (coin_value)
  {
    scanf("%s", tmp_val);
    coin_value = 0;
    results = 0;
    for (int w = 0; tmp_val[w] != '\0'; w++)
    {
      coin_value *= 10;
      coin_value += tmp_val[w] - 0x30;
    }
    if (coin_value != 0)
    {
      to_test.push(coin_value);
      while(!to_test.empty())
      {
        unsigned long tester = to_test.front();
        to_test.pop();
        unsigned long over2 = tester/2;
        unsigned long over3 = tester/3;
        unsigned long over4 = tester/4;
        if (tester < over2 + over3 + over4)
        {
          to_test.push(over2);
          to_test.push(over3);
          to_test.push(over4);
        }
        else
        {
          results += tester;
        }
      }
      printf("%lu\n", results);
    }
  }
}


0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜