Logic 检查是否可以从数组的算术运算中获得值

Logic 检查是否可以从数组的算术运算中获得值,logic,dynamic-programming,Logic,Dynamic Programming,我很抱歉没有正确地定义标题,但基本上是这样的: 给定一个大小为n的数组,其中包含元素a0、a1、a2…an-1和一个值K,通过在每个元素前插入+或-至少一个来确定K是否可获得。如果可获得,请打印“是”,否则请打印“否”。必须使用所有数字 例如: 输入: 4 6 1 2 3 4 输出: 对 解决方案:1-2+3+4 输入: 4 7 1 2 3 4 输出: 没有 我觉得完全有可能找到dp解决方案。这是递归: bool Recursion( int* myarray, int result, int

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

给定一个大小为n的数组,其中包含元素a0、a1、a2…an-1和一个值K,通过在每个元素前插入+或-至少一个来确定K是否可获得。如果可获得,请打印“是”,否则请打印“否”。必须使用所有数字

例如:

输入: 4 6 1 2 3 4 输出: 对 解决方案:1-2+3+4 输入: 4 7 1 2 3 4 输出: 没有

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

这是递归:

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;
}

不过,我会让你自己看。

你试过什么吗?你用的是什么语言?不要为没有正确地编排标题而感到抱歉。很抱歉,没有发布显示您为解决此问题所付出努力的代码。我们来这里是为了帮助你,而不是帮你做功课。这是两年前给我的一个问题,我能够以2^n的顺序强行执行它,这显然适用于较小的情况。你知道n的最大界限吗?如果不是太大,试一下所有的组合。n为100将给出10^30个案例,即使n不是太大。