我正在尝试使用C ++获取数组的所有组合
double* list1 = new double[size];
该数组中的项目为{1,2,3,4,5}
我需要将所有可能的组合添加到堆栈中,例如:
1+2, 1+2+3, 1+2+3+4,1+2+3+4+5, 1+3, 1+3+4, 1+3+4+5, 1+4, 1+4+5, 1+5...
我遇到的问题是我通过2 for循环和while循环
这样做for(int i = 0; i < size - 1; i++)
{
for(int j = i; j < size - 1; j++)
{
double temp = list1[i] + list1[j + 1];
list1combos.push(temp);
int k = j + 2;
while (k <= size - 1)
{
temp = temp + list1[k];
list1combos.push(temp);
k++;
}
}
}
我可以获得上面列出的内容,但我不知道如何使用1+3+5
或1+2+5
请告知如何获得这些组合,感谢stackoverflow!
答案 0 :(得分:1)
由于顺序无关紧要,我建议使用与x
大小相同的数组并对其执行二进制增量,即从仅仅0
s的数组开始并计算,直到你只有1
秒。对于1
的每次添加,您都会从x
数组中选择一个排列。
First iteration:
0 0 0 0 0 -> empty
Second iteration:
0 0 0 0 1 -> you pick 5
3rd iteration:
0 0 0 1 0 -> you pick 4
4th iteration:
0 0 0 1 1 -> you pick 4 and 5
And so on until you reach:
1 1 1 1 1 -> you pick 1, 2, 3, 4 and 5
答案 1 :(得分:0)
您可以通过打印集合{1,2,3,4,5}的所有子集来解决此问题。有2 ^ 5个 - 或2 ^ 5-1,因为集合{0)对你来说毫无意义。
此代码可以为您提供帮助。
#include<iostream>
#include<list>
#include <iterator>
void print( std::list<int> l){
std::copy( l.begin(), l.end(), std::ostream_iterator<int>( std::cout, " "));
std::cout << std::endl;
}
void subset( int arr[], int size, int left, int index, std::list<int> &l){
if( left == 0){
print(l);
return;
}
for( int i = index; i < size; i++){
l.push_back( arr[i]);
subset( arr, size, left - 1, i + 1, l);
l.pop_back();
}
}
int main() {
int array[5] = { 1, 2, 3, 4, 5} ;
std::list<int> lt;
subset( array, 5, 1, 0, lt);
subset( array, 5, 2, 0, lt);
subset( array, 5, 3, 0, lt);
subset( array, 5, 4, 0, lt);
subset( array, 5, 5, 0, lt);
return 0;
}
答案 2 :(得分:0)
其他人已经回答了你的问题。我指出了一件重要的事情:
double* list1=new double(size);
这不分配double
数组size
元素。
相反,它会分配单个 double
,并将其值设置为size
。尝试以数组形式访问它会导致未定义的行为,并可能导致崩溃。
你想这样做:
double* list1=new double[size];
注意使用方括号。另外请记住,当您要释放已分配的内存时,必须调用delete[] list1;
而不是简单地delete list1;
。
答案 3 :(得分:0)
以下可能有所帮助:http://ideone.com/SpCejs
template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
for (std::size_t i = 0; i != bs.size(); ++i) {
if (bs.flip(i).test(i) == true) {
return true;
}
}
return false;
}
template <typename T, std::size_t N>
void print_combinaison(const std::array<T, N>& a)
{
std::bitset<N> bs;
do {
for (std::size_t i = 0; i != N; ++i) {
if (bs.test(i)) {
std::cout << a[i] << " ";
}
}
std::cout << std::endl;
} while (increase(bs));
}