我如何确定我是否可以将数组中的某些元素求和为 K

How do I find out if I can sum some elements in an array to K?

本文关键字:元素 求和 数组 何确定 是否      更新时间:2023-10-16

假设我得到了一个任意数组,只有正值,例如A[5] = {2,3,4,2}。我想检查一下,给定一个int x,假设x=2,看看A[2]是否可以是数组中其他元素的总和。在这种情况下它可以,因此我们可以打印出TRUE因为A[0]A[3]加起来 A[2] .对于具有例如 100 个或更多元素的较大数组,确定A[x]是否可以由同一数组中的其他元素求和的好方法是什么?

这有点蛮力O(n*log(n))。

#include <iostream>
#include <algorithm>
#include <vector>
bool check_helper( std::vector< int > & data, std::vector< int >::iterator position, int value )
{
#if 0   
    std::cout << "check2helper( data, " << *position << ", " << value << ")n";
#endif
    if( *position == value )
        return true;
    else if( position == data.begin() )
        return false;
    else return check_helper( data, position - 1, value - *position ) || check_helper( data, position - 1, value );
}
bool check( const std::vector< int > & data, size_t element_index )
{
    std::vector< int > data_copy( data );
    int value = data_copy[element_index];
    data_copy.erase( data_copy.begin() + element_index );
    std::sort( data_copy.begin(), data_copy.end() );
    std::vector< int >::iterator iter( std::lower_bound( data_copy.begin(), data_copy.end(), value ) );
#if 0
    std::cout << "  Checking " << value << " in ";
    for( std::vector< int >::iterator i( data_copy.begin() ); i <= iter; ++i )
        std::cout << *i << " , ";
    std::cout << std::endl;
#endif               
    return check_helper( data_copy, iter, value );
}
int main( int argc, char ** argv )
{
    std::vector< int > ints{ 1, 2, 4, 23, 97, 146, 11, 17, 301, 24, 12, 2 };
    std::cout << "Testing ints = ";
    for( auto v : ints )
        std::cout << v << ", ";
    std::cout << std::endl;
    for( size_t i = 0; i < ints.size(); ++i )
    {
        std::cout << "ints[" << i << "] == " << ints[i] << " ---> " << ( check( ints, i ) ? "TRUE" : "FALSE" ) << std::endl;
    }
    return 0;
}

结果:

Testing ints = 1, 2, 4, 23, 97, 146, 11, 17, 301, 24, 12, 2, 
ints[0] == 1 ---> FALSE
ints[1] == 2 ---> TRUE
ints[2] == 4 ---> TRUE
ints[3] == 23 ---> TRUE
ints[4] == 97 ---> FALSE
ints[5] == 146 ---> TRUE
ints[6] == 11 ---> FALSE
ints[7] == 17 ---> TRUE
ints[8] == 301 ---> TRUE
ints[9] == 24 ---> TRUE
ints[10] == 12 ---> TRUE
ints[11] == 2 ---> TRUE