我有一个数组,我需要在给定以下约束的情况下对此数组进行所有可能的排列:
可能的值为:0.25,0.5,0.75,1.0,1.25,1.5,1.75,2.0。
该数组有18个元素。每个元素可以包含上述值之一。允许重复,例如:0.25,0.25,0.5等...
我需要采用什么类型的迭代来覆盖每个排列(而不是组合)?
for(...)
{
std::vector<float> array;
for(...)
array.push_back...
}
etc
我的问题并不是要找到给定数组的所有排列:
我只想:
for example:
0.25 0.25 0.25
0.5 0.25 0.25
1.0 0.25 0.25
...
All the way to
2.0 2.0 2.0
答案 0 :(得分:0)
这是一个程序,它会将所有这些组合(厌倦,加载它们)打印到名为combinations.txt的文件中。但请注意,它需要一段时间,输出将是巨大的,因为有很多这些组合。至于它是如何工作的,它是一个快速而肮脏的解决方案,其中我有一个包含18个元素的int数组。我使用了int,因为它更容易在整数运算中工作,但是输出通过除以100转换为所需的格式。现在,应用程序在文件中打印出每个组合,然后递增第一个如果元素超过200(或者你为2.00),它将该元素设置为25,并将数组中的下一个元素递增25。它就像计数一样,当你达到9时,第一个数字包裹并为下一个更高的功率添加一个。
#include <cstdio>
#include <cmath>
FILE *pOut;
void PrintCombinationToFile ( int *pArray )
{
fprintf ( pOut, "\n" );
for ( unsigned i = 0; i < 18; i++ )
fprintf ( pOut, "%.2f ", pArray[i] * 1.0 / 100.0 );
}
int IncrementArray ( int *pArray )
{
unsigned i = 0;
pArray[0] += 25;
while ( pArray[i] > 200 )
{
if ( i == 18 )
return 0;
pArray[i] = 25;
pArray[i+1] += 25;
i++;
}
return 1;
}
int main()
{
int initialArray[18];
int i;
pOut = fopen ( "combinations.txt", "w" );
if ( !pOut )
{
printf ( "\nUnable to open a new file." );
return 1;
}
for ( i = 0; i < 18; i++ )
initialArray[i] = 25;
PrintCombinationToFile(initialArray);
while(IncrementArray(initialArray))
PrintCombinationToFile(initialArray);
fflush ( pOut );
fclose ( pOut );
printf ( "Done!")
return 0;
}