Menjana Gabungan dalam C
Pengenalan Masalah
Menjana gabungan ialah operasi biasa dalam pelbagai senario pengaturcaraan. Ia terdiri daripada mencipta set yang mengandungi bilangan elemen tertentu daripada koleksi yang lebih besar. Artikel ini meneroka cara menangani cabaran menjana kombinasi dalam C .
Penyelesaian dengan std::next_permutation
Satu pendekatan yang berkesan ialah memanfaatkan fungsi std::next_permutation daripada Perpustakaan Standard C. Berikut ialah pelaksanaan:
#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; }
Penyelesaian ini bermula dengan mencipta tatasusunan pemilihan (v) dan meletakkan pemilih r di kedudukan r terakhir. Fungsi std::next_permutation menjana semua pilih atur pemilih ini. Untuk setiap pilih atur, ia mencetak ahli set yang sepadan dengan kedudukan yang dipilih.
Alternatif dengan std::prev_permutation
Untuk situasi di mana gabungan harus dikeluarkan dalam bentuk yang berbeza pesanan, pertimbangkan untuk menggunakan std::prev_permutation sebaliknya:
#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; }
Variasi ini menukar susunan gabungan, menjadikan output lebih mudah untuk ditafsirkan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Gabungan dengan Cekap dalam C Menggunakan `std::next_permutation` dan `std::prev_permutation`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!