Maison > développement back-end > C++ > Comment puis-je générer efficacement des combinaisons en C à l'aide de « std :: next_permutation » et « std :: prev_permutation » ?

Comment puis-je générer efficacement des combinaisons en C à l'aide de « std :: next_permutation » et « std :: prev_permutation » ?

Susan Sarandon
Libérer: 2024-12-03 13:05:12
original
482 Les gens l'ont consulté

How Can I Efficiently Generate Combinations in C   Using `std::next_permutation` and `std::prev_permutation`?

Génération de combinaisons en C

Introduction au problème

La génération de combinaisons est une opération courante dans divers scénarios de programmation. Elle consiste à créer des ensembles contenant un nombre spécifié d’éléments issus d’une collection plus vaste. Cet article explore comment relever le défi de la génération de combinaisons en C.

Solution avec std::next_permutation

Une approche efficace consiste à exploiter la fonction std::next_permutation de la bibliothèque standard C. Voici une implémentation :

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    int n, r;
    std::cin >> n >> r;

    std::vector<bool> v(n);
    std::fill(v.end() - r, v.end(), true);

    do {
        for (int i = 0; i < n; ++i) {
            if (v[i]) {
                std::cout << (i + 1) << " ";
            }
        }
        std::cout << "\n";
    } while (std::next_permutation(v.begin(), v.end()));
    return 0;
}
Copier après la connexion

Cette solution commence par créer un tableau de sélection (v) et placer r sélecteurs dans les r dernières positions. La fonction std::next_permutation génère toutes les permutations de ces sélecteurs. Pour chaque permutation, il imprime les membres de l'ensemble correspondant aux positions sélectionnées.

Alternative avec std::prev_permutation

Pour les situations où les combinaisons doivent être sorties dans un format différent ordre, pensez à utiliser std::prev_permutation à la place :

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
   int n, r;
   std::cin >> n >> r;

   std::vector<bool> v(n);
   std::fill(v.begin(), v.begin() + r, true);

   do {
       for (int i = 0; i < n; ++i) {
           if (v[i]) {
               std::cout << (i + 1) << " ";
           }
       }
       std::cout << "\n";
   } while (std::prev_permutation(v.begin(), v.end()));
   return 0;
}
Copier après la connexion

Cette variante alterne l'ordre des combinaisons, rendant le résultat plus facile à interpréter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal