我如何确定我是否可以将数组中的某些元素求和为 K
How do I find out if I can sum some elements in an array to K?
假设我得到了一个任意数组,只有正值,例如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
相关文章:
- 如何对多维 std::vector 的所有元素求和?
- 使用 C++17 或更高版本对向量中的元素对求和的最'functional'方法?
- 在 MPI 中逐个元素对数组元素求和和收集
- 以C++递归方式对链表中的元素求和
- CUDA:所有矢量元素的级联求和
- 将彼此平行的两个 int 向量的元素求和
- 使用变换和加 () 对向量的元素进行求和和模 10^9+7<int>。有什么办法可以做到这一点吗?
- 用以下方法对数组中的元素求和的有效方法是什么
- 难以对 2D 矢量的元素求和
- 循环访问 CUDA 中的三维数组以对它们的元素求和
- 如何将函数静态应用于非类型模板包的各个元素并对结果求和
- 我如何确定我是否可以将数组中的某些元素求和为 K
- 在C++中使用do-while循环对向量的元素求和
- 在c++中对最小数组元素求和
- 递归算法对数组中值小于x的每个元素求和
- 如何使用本函数对两个字符数组进行元素相乘,并将相乘结果求和为int
- 如何对一个公共矩阵中的所有元素求和
- 通过迭代器对map的元素求和
- 如何在c++中对multimap中具有相同键的所有元素求和
- 在一个数组中查找求和为k的两个元素