Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对向量中的所有组合求和_C++ - Fatal编程技术网

C++ 对向量中的所有组合求和

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] =

我试图计算一个向量中所有可能的组合数之和。如果组合等于给定的数字,则函数返回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] == 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