在数组中排列运算符,使得总和等于给定结果

时间:2012-08-30 11:45:31

标签: algorithm recursion dynamic-programming

给定数组A,假设{5, 5, 4, 3, 7},在{*, /, + -}上使用操作5, 5, 4, 3,并将结果作为7。如果可能,请打印答案。如果不是,return 0

Answer : 5 * 5 - 4 / 3 = 7

我使用递归,强力,检查所有情况来解决这个问题。

我的代码:

void check_result(int* arr, int size, char* op, int depth, int result, int val)
{
    if(depth==size)
    {
        if(val==result)
        {
             // call function to print pattern of op[]
        }
        return ;
    }
    else
    {
        op[depth]='+';
        check_result( arr+1, size, op, depth+1, result, val + *arr );

        op[depth]='-';
        check_result( arr+1, size, op, depth+1, result, val - *arr );

        op[depth]='*';
        check_result( arr+1, size, op, depth+1, result, val * (*arr) );

        op[depth]='/';
        if( *arr )
            check_result( arr+1, size, op, depth+1, result, val / (*arr) );
    }
}

你能否告诉我这个问题的动态方法,因为这需要O(4^n)时间。

1 个答案:

答案 0 :(得分:1)

州应该是DP[position][currentValue]。这意味着如果您处于相应的position且拥有currentValue,则可以实现requiredResult。

boolean rec(int position, int currentValue)
{
   if (position == lastPosition)
   {
      return currentValue == neededResult;
   } 

   if (computed[position][currentValue]) return DP[position][currentValue]; 

   boolean can = false; 
   int nextNumber = numbers[position + 1];

   //Try every operation here and call rec again
   can |= rec(position + 1, currentValue + nextNumber);
   can |= rec(position + 1, currentValue - nextNumber);
   can |= rec(position + 1, currentValue * nextNumber);
   can |= rec(position + 1, currentValue / nextNumber);

   DP[position][currentValue] = can;
   computed[position][currentValue] = true;
   return can;
}

然后,您可以使用其他方法恢复结果:

   void restore(int position, int currentValue)
    {
       if (position == lastPosition) return;

       if (DP[position + 1][currentValue + nextNumber]) 
       { 
          cout << " + ";          
          restore(position + 1, currentValue + nextNumber);
       }
       else
       if (DP[position + 1][currentValue - nextNumber]) 
       { 
          cout << " - ";          
          restore(position + 1, currentValue - nextNumber);
       }
       else
       if (DP[position + 1][currentValue * nextNumber]) 
       { 
          cout << " * ";          
          restore(position + 1, currentValue * nextNumber);
       }
       else
       if (DP[position + 1][currentValue / nextNumber]) 
       { 
          cout << " / ";          
          restore(position + 1, currentValue / nextNumber);
       }
    }

P.S。这只是PSEUDOCODE。可能存在错误和错过的案例。