Maison > développement back-end > C++ > Comment puis-je générer efficacement des combinaisons en C à l'aide de la manipulation de bits ?

Comment puis-je générer efficacement des combinaisons en C à l'aide de la manipulation de bits ?

Linda Hamilton
Libérer: 2024-11-29 04:14:11
original
917 Les gens l'ont consulté

How Can I Efficiently Generate Combinations in C   Using Bit Manipulation?

Générer des combinaisons en C : une solution complète

La génération de combinaisons est une tâche de programmation fondamentale qui implique la sélection d'un nombre spécifique d'éléments dans un ensemble . Par exemple, si nous avons un ensemble S = {1, 2, 3, 4, 5} et que nous voulons générer des combinaisons de taille r = 2, la sortie inclura des combinaisons telles que (1, 2), (1, 3 ), (2, 3), et ainsi de suite.

Un moyen efficace de générer des combinaisons en utilisant C consiste à utiliser la manipulation de bits. Nous pouvons initialiser un vecteur de booléens de longueur n, représentant les éléments de l'ensemble, puis remplir les r premiers éléments avec vrai. Cela signifie que les éléments correspondants sont sélectionnés dans la combinaison actuelle.

L'étape suivante consiste à créer toutes les permutations de ce vecteur de sélection à l'aide de la fonction std::next_permutation. Pour chaque permutation, nous vérifions si un élément est sélectionné (indiqué par une valeur vraie dans le vecteur) et imprimons l'élément correspondant. En parcourant toutes les permutations, nous pouvons générer toutes les combinaisons possibles.

Voici un extrait de code utilisant cette approche :

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

int main() {
    int n, r;
    std::cin >> n;
    std::cin >> 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

Alternativement, nous pouvons utiliser la fonction std::prev_permutation pour générer des combinaisons par ordre croissant :

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

int main() {
   int n, r;
   std::cin >> n;
   std::cin >> 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

En utilisant ces techniques, nous pouvons générer efficacement des combinaisons en C, fournissant un outil puissant pour diverses applications algorithmiques.

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