我很抱歉没有正确地标题,但基本上就是这样:
给定一个大小为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解决方案。
答案 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;
}
但是,我会留给你阅读。