C++ 对向量中的所有组合求和
我试图计算一个向量中所有可能的组合数之和。如果组合等于给定的数字,则函数返回false。如果没有与该数字相等的组合,数组将打印该数字并返回true 这就是我所拥有的:C++ 对向量中的所有组合求和,c++,C++,我试图计算一个向量中所有可能的组合数之和。如果组合等于给定的数字,则函数返回false。如果没有与该数字相等的组合,数组将打印该数字并返回true 这就是我所拥有的: bool t(vector<int>vi, int num){ for(int i = 0; i < vi.size(); i++) { int sum=vi[i]; for(int j = i+1; j < d.size(); j++) { if(sum + vi[j] =
bool t(vector<int>vi, int num){
for(int i = 0; i < vi.size(); i++) {
int sum=vi[i];
for(int j = i+1; j < d.size(); j++) {
if(sum + vi[j] == num) return false;
}
}
cout<< num << endl;
return true;
}
bool t(向量,整数){
对于(int i=0;i 从数学上讲,你可以通过把数组想象成一个长度为n
的二进制字符串来迭代实现这一点。在每个索引处,它要么是1
要么是0
。如果它是1
,我们将它添加到和中,如果它是0
,我们将它从和中排除
您所要做的就是遍历从000….000
到111….111
的每个可能长度n
二进制字符串,并根据激活的索引求和
就遍历所有可能的二进制字符串而言,您可以拥有一个大小为n
的数组,该数组的所有索引都设置为0
。然后您只需循环,直到它成为一个数组,所有索引都设置为1
。循环的每次迭代都会将1
添加到索引n-1
处的位。如果t位是1
,将其设置为0
,并将1
带入并添加到n-2
位置的位,依此类推(进行二进制加法)。递归是解决此问题的一种很好的方法
bool t_helper(vector<int>::const_iterator it, vector<int>::const_iterator end, int sum_left)
{
if (sum_left == 0) return false;
if (it == end) return true;
return t_helper(it+1, end, sum_left - *it) && t_helper(it+1, end, sum_left);
}
bool t(const vector<int>& vi, int num)
{
bool result = t_helper(vi.begin(), vi.end(), num);
if (result) cout << num << endl;
return result;
}
bool t_helper(向量::常量迭代器it,向量::常量迭代器end,int sum_left)
{
if(sum_left==0)返回false;
如果(it==end)返回true;
返回t_helper(it+1,end,sum_left-*it)和&t_helper(it+1,end,sum_left);
}
布尔t(常数向量和vi,整数)
{
bool result=t_helper(vi.begin(),vi.end(),num);
如果(结果)我能在上找到几个解决方案,包括定义类型,但我确信它可以在现有类型上完成。你的sum和x变量是一样的吗?所有可能的组合的总和是什么意思?多少个数字的组合?@ShashwatKumar是的,我在更改变量名时忽略了这一点。你是指2个数字的总和,然后是3个,等等如果n<32
,您可以直接使用uint32\u t
。我当前的目的在数组中永远不会有负数,但我以后可能会使用。顺便问一下,在t()
中如何获得sum\u left
而不声明它?@user2509848:Typo。最初的大小写是sum\u left=num
。