Logic 检查是否可以从数组的算术运算中获得值
我很抱歉没有正确地定义标题,但基本上是这样的: 给定一个大小为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解决方案。这是递归: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
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不是太大。