我怎样才能写出'n'字符串的所有组合?重复:C=n!/(n-k)! [关闭]

Posted

技术标签:

【中文标题】我怎样才能写出\'n\'字符串的所有组合?重复:C=n!/(n-k)! [关闭]【英文标题】:How can I write all the combinations of 'n' strings? With Repetition: C=n!/(n-k)! [closed]我怎样才能写出'n'字符串的所有组合?重复:C=n!/(n-k)! [关闭] 【发布时间】:2013-06-16 12:48:52 【问题描述】:

对不起,如果问题不清楚,我想知道如何用 C++ 编写一个可以输出所有句子组合的程序,使用公式C=n!/(n-k)!。例如,这就是我想要打印的那种东西:

combination no 1: sentence1 sentence2 sentence3 sentence4

combination no 2: sentence1 sentence2 sentence4 sentence3

combination no 3: sentence1 sentence3 sentence2 sentence4

combination no 4: sentence1 sentence3 sentence4 sentence2

combination no 5: sentence1 sentence4 sentence3 sentence2

combination no 6: sentence1 sentence4 sentence2 sentence3

And so on...

另外,是否可以有多达 10 亿个组合或有一些限制?

编辑。

我尝试了以下程序,但找不到更改上述公式中“k”变量的方法。

// next_permutation example
#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort
#include <string>       // std::string
#include <vector>       // std::vector

int main () 
  std::string sentence1 = " A Sentence number one ";
  std::string sentence2 = " B Sentence number two ";
  std::string sentence3 = " C Sentence number three ";
  std::string sentence4 = " D Sentence number four ";

  // Store all the elements in a container ( here a std::vector)
  std::vector<std::string> myVectorOfStrings;      
  // In the vector we add all the sentences.
  // Note : It is possible to do myVectorOfStrings.push_back("Some sentence");
  myVectorOfStrings.push_back(sentence1);
  myVectorOfStrings.push_back(sentence2);
  myVectorOfStrings.push_back(sentence3);
  myVectorOfStrings.push_back(sentence4);

  // The elements must be sorted to output all the combinations
  std::sort (myVectorOfStrings.begin(),myVectorOfStrings.end());


  std::cout << "The 4! possible permutations with 4 elements:\n";
  do 
    //This printing can be improved to handle any number of sentences, not only four.
    std::cout << myVectorOfStrings[0] << ' ' << myVectorOfStrings[1] << ' ' << myVectorOfStrings[2] << ' ' << myVectorOfStrings[3] << '\n';
   while ( std::next_permutation(myVectorOfStrings.begin(),myVectorOfStrings.end()) );

  std::cout << "After loop: "  << myVectorOfStrings[0] << ' ' << myVectorOfStrings[1] << ' ' << myVectorOfStrings[2] << ' ' << myVectorOfStrings[3] << '\n';

  return 0;

【问题讨论】:

std::next_permutation 提示:“请为我编写整个程序”的请求不被看好。 好的,我记下了。 【参考方案1】:

您可能的意思是您想要所有可能的 'n' 字符串组合。 有n!可能的情况。 您可以使用std::next_permutation 方法如下:

我想你所有的句子都是这样的 std::string :

// next_permutation example
#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort
#include <string>       // std::string
#include <vector>       // std::vector

int main () 
  std::string sentence1 = " A Sentence number one ";
  std::string sentence2 = " B Sentence number two ";
  std::string sentence3 = " C Sentence number three ";
  std::string sentence4 = " D Sentence number four ";

  // Store all the elements in a container ( here a std::vector)
  std::vector<std::string> myVectorOfStrings;      
  // In the vector we add all the sentences.
  // Note : It is possible to do myVectorOfStrings.push_back("Some sentence");
  myVectorOfStrings.push_back(sentence1);
  myVectorOfStrings.push_back(sentence2);
  myVectorOfStrings.push_back(sentence3);
  myVectorOfStrings.push_back(sentence4);

  // The elements must be sorted to output all the combinations
  std::sort (myVectorOfStrings.begin(),myVectorOfStrings.end());


  std::cout << "The 4! possible permutations with 4 elements:\n";
  do 
    //This printing can be improved to handle any number of sentences, not only four.
    std::cout << myVectorOfStrings[0] << ' ' << myVectorOfStrings[1] << ' ' << myVectorOfStrings[2] << ' ' << myVectorOfStrings[3] << '\n';
   while ( std::next_permutation(myVectorOfStrings.begin(),myVectorOfStrings.end()) );

  std::cout << "After loop: "  << myVectorOfStrings[0] << ' ' << myVectorOfStrings[1] << ' ' << myVectorOfStrings[2] << ' ' << myVectorOfStrings[3] << '\n';

  return 0;

这是一个简单的打印示例。 如果你有超过 4 个字符串,在 do-while 循环中你会使用类似this

do-while 循环将是:

do 
  //Print all the sentences in my vector :
  for( auto i = myVectorOfStrings.begin(); i != myVectorOfStrings.end(); ++i)
    std::cout << *i << ' ';
  // Go to the next line
  std::cout << std::endl;
 while ( std::next_permutation(myVectorOfStrings.begin(),myVectorOfStrings.end()) );

另外,是否有可能拥有多达 10 亿个组合? 有什么限制吗?

唯一的限制是内存。 在此示例中,您只有 1 个存储所有字符串的向量。 所以如果你有 10 个字符串,你将有 10 个! = 3,628,800 种不同的组合,但内存本身只是包含 10 个字符串的向量使用的内存。

【讨论】:

如何更改公式中 k 的值?【参考方案2】:

您可以使用next_permutation 来执行此操作。

【讨论】:

以上是关于我怎样才能写出'n'字符串的所有组合?重复:C=n!/(n-k)! [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在C中创建n个项目的k和m个组合的所有可能子集[重复]

含有重复字符的字符串排列组合

如何输出字符串的所有组合

从给定的单词列表中生成具有“N”长度的所有可能组合(寻找不重复)

不重复的单词组合

生成 0, 1,...n-1, n 个 k 数的所有可能组合。每个组合应按升序排列[重复]