检查是否可以从数组上的算术运算获得一个值

时间:2015-06-20 18:09:02

标签: logic dynamic-programming

我很抱歉没有正确地标题,但基本上就是这样:

给定一个大小为n的数组,其元素为 0 1 2 ... a n-1 和值K,通过在每个元素之前插入+或 - (至少一个)来确定是否可以获得K.如果可以获得其他NO,则打印YES。必须使用所有数字。

例如:

输入:
4 6
1 2 3 4

输出:


解决方案:1 - 2 + 3 + 4

输入:
4 7
1 2 3 4

输出:
没有

我觉得完全有可能找到一个dp解决方案。

1 个答案:

答案 0 :(得分:0)

这是递归:

bool Recursion( int* myarray, int result, int size ){
    myarray[0] *= -1;
    if( size == 1 ){
        if( result == myarray[0] )
            return true;
    }
    else if( Recursion( (myarray+1), (result-myarray[0]), size-1 ) ) 
        return true;

    myarray[0] *= -1;
    if( size == 1 ){
        if( result == myarray[0] )
            return true;
    }
    else if( Recursion( (myarray+1), (result-myarray[0]), size-1 ) ) 
        return true;

    return false;
}

这是主要的实施方式:

void printarray( int* myarray, int size ){
    for( int i = 0; i < size ; i++ ){
        std::cout << myarray[i];
        if( i != size-1 )
            std::cout << " + ";
    }
    std::cout << std::endl;
}

int main(){

    const int size = 4;
    const int result = 6;
    int myarray[size] = {1,2,3,4};

    bool test = Recursion( myarray, result, size );

    if( test ){
        std::cout << "YES... Solution: ";
        printarray( myarray, size );
    }
    else{
        std::cout << "NO... " << std::endl;
        printarray( myarray, size );
    }

    system("pause");
    return 0;
}

但是,我会留给你阅读。