


Bina rentetan perduaan panjang K daripada tatasusunan mengikut keadaan yang diberikan
Dalam tutorial ini, kita perlu membina rentetan binari panjang K, yang sepatutnya mengandungi "1" pada indeks ke-i jika jumlah subset sama dengan I boleh dicapai menggunakan elemen tatasusunan. Kami akan belajar dua cara untuk menyelesaikan masalah tersebut. Dalam pendekatan pertama, kami akan menggunakan kaedah pengaturcaraan dinamik untuk menyemak sama ada kemungkinan jumlah subset adalah sama dengan indeks "I". Dalam kaedah kedua, kami akan menggunakan bitset untuk mencari semua jumlah yang mungkin melalui elemen tatasusunan.
Pernyataan Masalah - Kami diberi tatasusunan yang mengandungi N integer. Selain itu, kita diberi integer M yang mewakili panjang rentetan binari. Kita perlu mencipta rentetan binari dengan panjang M supaya ia mematuhi syarat berikut.
Watak pada indeks "I" ialah 1 jika kita boleh mencari subset daripada tatasusunan yang jumlahnya sama dengan indeks "I" jika tidak, ia adalah 0.
Indeks saya bermula dari 1.
Contoh Contoh
Input – arr = [1, 2] M = 4
Output – 1110
Arahan
Subset yang jumlahnya bersamaan dengan 1 ialah {1}.
Subset yang jumlahnya bersamaan dengan 2 ialah {2}.
Subset yang jumlahnya bersamaan dengan 3 ialah {1, 2}.
Kami tidak dapat mencari subset yang jumlahnya bersamaan dengan 4, jadi kami meletakkan 0 pada indeks ke-4.
Input – arr = [1, 3, 1] M = 9
Output – 111110000
Arahan
Kita boleh mencipta semua kombinasi yang mungkin supaya jumlahnya adalah antara 1 dan 5. Jadi, 5 aksara pertama ialah 1 dan 4 aksara terakhir ialah 0.
Input – arr = [2, 6, 3] M = 6
Output – 011011
Arahan
Anda tidak boleh mendapatkan jumlah yang sama dengan 1 dan 4 menggunakan elemen tatasusunan, jadi kami meletakkan 0 pada kedudukan indeks pertama dan keempat.
Kaedah 1
Dalam kaedah ini kita akan menggunakan pengaturcaraan dinamik untuk menyemak sama ada kita boleh membina jumlah yang sama dengan indeks 'I' menggunakan elemen tatasusunan. Kami akan menyemaknya untuk setiap indeks dan menambahkan 1 atau 0 pada rentetan binari.
Algoritma
Langkah 1 - Buat vektor bersaiz N dan mulakan dengan nilai integer. Juga, tentukan pembolehubah "bin" bagi rentetan jenis dan mulakannya dengan rentetan kosong.
Langkah 2 - Gunakan gelung for untuk menjadikan jumlah bilangan lelaran sama dengan panjang rentetan.
Langkah 3 - Dalam gelung for, panggil fungsi isSubsetSum() dengan menghantar array N dan nilai indeks sebagai parameter.
Langkah 4 - Jika fungsi isSubsetSum() kembali benar, tambahkan "1" pada "bin". Jika tidak, tambahkan "0" pada "bin".
Langkah 5 - Tentukan fungsi isSubsetSum() untuk menyemak sama ada elemen tatasusunan boleh dijumlahkan.
Langkah 5.1 - Takrifkan vektor dua dimensi bernama dpTable.
Langkah 5.2 - Mulakan 'dpTable[i][0]' kepada benar kerana jumlah sifar sentiasa mungkin. Di sini, 'I' ialah nilai indeks.
Langkah 5.3 - Mulakan 'dpTable[0][j]' kepada palsu kerana jumlah tatasusunan kosong tidak boleh dilakukan.
Langkah 5.4 - Sekarang, gunakan dua gelung bersarang. Gelung pertama lelaran dari 1 ke N dan gelung lain lelaran dari 1 kepada jumlah.
Langkah 5.5 - Dalam gelung for, jika nilai elemen semasa lebih besar daripada jumlah, abaikan ia.
Langkah 5.6 − Jika tidak, masukkan atau kecualikan elemen untuk mendapatkan jumlah.
Langkah 5.7 − Kembalikan 'dpTable[N][sum]' yang mengandungi keputusan.
Contoh
#include <iostream> #include <vector> using namespace std; // Function to check if subset-sum is possible bool isSubsetSum(vector<int> &arr, int N, int sum){ vector<vector<bool>> dpTable(N + 1, vector<bool>(sum + 1, false)); // Base cases for (int i = 0; i <= N; i++) // If the sum is zero, then the answer is true dpTable[i][0] = true; // for an empty array, the sum is not possible for (int j = 1; j <= sum; j++) dpTable[0][j] = false; // Fill the dp table for (int i = 1; i <= N; i++){ for (int j = 1; j <= sum; j++){ // if the current element is greater than the sum, then we can't include it if (arr[i - 1] > j) dpTable[i][j] = dpTable[i - 1][j]; // else we can either include it or exclude it to get the sum else dpTable[i][j] = dpTable[i - 1][j] || dpTable[i - 1][j - arr[i - 1]]; } } // The last cell of the dp table contains the result return dpTable[N][sum]; } int main(){ // Given M int M = 9; // Creating the vector vector<int> arr = {1, 3, 1}; // getting the size of the vector int N = arr.size(); // Initializing the string string bin = ""; // Making k iteration to construct the string of length k for (int i = 1; i <= M; i++){ // if the subset sum is possible, then add 1 to the string, else add 0 if (isSubsetSum(arr, N, i)){ bin += "1"; } else{ bin += "0"; } } // print the result. cout << "The constructed binary string of length " << M << " according to the given conditions is "; cout << bin; return 0; }
Output
The constructed binary string of length 9 according to the given conditions is 111110000
Kerumitan masa - O(N^3), kerana kerumitan masa isSubsetSum() ialah O(N^2) dan kami memanggilnya N kali dalam kod pemandu.
Kerumitan ruang - O(N^2), kerana kami menggunakan vektor dua dimensi dalam fungsi isSubsetSum().
Cara menggunakan Bitset
Dalam kaedah ini, kami akan menggunakan set bit untuk mencari semua nilai jumlah yang mungkin dengan menggabungkan elemen tatasusunan yang berbeza. Di sini, bitset bermaksud ia mencipta rentetan binari. Dalam set bit yang terhasil, setiap bit daripadanya mewakili sama ada jumlah itu mungkin sama dengan indeks tertentu, dan kita perlu mencarinya di sini.
Algoritma
Langkah 1 - Tentukan tatasusunan dan M. Selain itu, tentukan fungsi createBinaryString().
Langkah 2 - Seterusnya, tentukan set bit panjang yang dikehendaki, yang akan mencipta rentetan binari.
Langkah 3 - Mulakan bit[0] kepada 1, kerana jumlah 0 sentiasa mungkin.
Langkah 4 - Gunakan gelung for untuk mengulangi elemen tatasusunan
.
Langkah 5 - Mula-mula, lakukan operasi anjakan kiri "sedikit" pada elemen tatasusunan. Nilai yang terhasil kemudiannya OR dengan nilai bit.
Langkah 6 − Cetak nilai set bit dari indeks 1 hingga M.
Contoh
#include <bits/stdc++.h> using namespace std; // function to construct the binary string void createBinaryString(int array[], int N, int M){ bitset<100003> bit; // Initialize with 1 bit[0] = 1; // iterate over all the integers for (int i = 0; i < N; i++){ // perform left shift by array[i], and OR with the previous value. bit = bit | bit << array[i]; } // Print the binary string cout << "The constructed binary string of length " << M << " according to the given conditions is "; for (int i = 1; i <= M; i++){ cout << bit[i]; } } int main(){ // array of integers int array[] = {1, 4, 2}; int N = sizeof(array) / sizeof(array[0]); // value of M, size of the string int M = 8; createBinaryString(array, N, M); }
Output
The constructed binary string of length 8 according to the given conditions is 11111110
Kerumitan masa - O(N) kerana kami menggunakan gelung tunggal.
Kerumitan ruang - O(N) kerana kami menyimpan nilai set bit.
Kesimpulan
Di sini, kami mengoptimumkan kaedah kedua, yang lebih baik daripada kaedah pertama dari segi kerumitan ruang dan masa. Walau bagaimanapun, kaedah kedua mungkin sukar difahami oleh pemula jika anda tidak mempunyai pemahaman tentang set bit.
Atas ialah kandungan terperinci Bina rentetan perduaan panjang K daripada tatasusunan mengikut keadaan yang diberikan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Perbezaan prestasi antara C# dan C terutamanya dicerminkan dalam kelajuan pelaksanaan dan pengurusan sumber: 1) C biasanya melakukan lebih baik dalam pengiraan berangka dan operasi rentetan kerana ia lebih dekat dengan perkakasan dan tidak mempunyai overhead tambahan seperti pengumpulan sampah; 2) C# lebih ringkas dalam pengaturcaraan berbilang thread, tetapi prestasinya sedikit lebih rendah daripada C; 3) Bahasa yang harus dipilih harus ditentukan berdasarkan keperluan projek dan tumpukan teknologi pasukan.

C isnotdying; it'sevolving.1) c suplemenvantduetoitsverversatilityandeficiencyinperformance-criticalapplications.2) thelanguageiscontinuouslyupdated, withc 20introducingfeatureslikemodulesandcoroutinestoMproveusability.3)

C digunakan secara meluas dan penting di dunia moden. 1) Dalam pembangunan permainan, C digunakan secara meluas untuk prestasi tinggi dan polimorfisme, seperti Unrealengine dan Perpaduan. 2) Dalam sistem perdagangan kewangan, latensi rendah C dan throughput yang tinggi menjadikannya pilihan pertama, sesuai untuk perdagangan frekuensi tinggi dan analisis data masa nyata.

Terdapat empat perpustakaan XML yang biasa digunakan di C: TinyXML-2, PugixML, Xerces-C, dan RapidXML. 1.TinyXML-2 sesuai untuk persekitaran dengan sumber terhad, fungsi ringan tetapi terhad. 2. PugixML cepat dan menyokong pertanyaan XPath, sesuai untuk struktur XML yang kompleks. 3.xerces-C berkuasa, menyokong resolusi DOM dan SAX, dan sesuai untuk pemprosesan kompleks. 4. RapidXML memberi tumpuan kepada prestasi dan parses sangat cepat, tetapi tidak menyokong pertanyaan XPath.

C Berinteraksi dengan XML melalui perpustakaan pihak ketiga (seperti TinyXML, PugixML, Xerces-C). 1) Gunakan perpustakaan untuk menghuraikan fail XML dan menukarnya ke dalam struktur data C-diproses. 2) Apabila menjana XML, tukar struktur data C ke format XML. 3) Dalam aplikasi praktikal, XML sering digunakan untuk fail konfigurasi dan pertukaran data untuk meningkatkan kecekapan pembangunan.

Perbezaan utama antara C# dan C ialah sintaks, prestasi dan senario aplikasi. 1) Sintaks C# lebih ringkas, menyokong pengumpulan sampah, dan sesuai untuk pembangunan rangka kerja .NET. 2) C mempunyai prestasi yang lebih tinggi dan memerlukan pengurusan memori manual, yang sering digunakan dalam pengaturcaraan sistem dan pembangunan permainan.

Sejarah dan evolusi C# dan C adalah unik, dan prospek masa depan juga berbeza. 1.C dicipta oleh BjarnestroustRup pada tahun 1983 untuk memperkenalkan pengaturcaraan berorientasikan objek ke dalam bahasa C. Proses evolusinya termasuk pelbagai standardisasi, seperti C 11 memperkenalkan kata kunci auto dan ekspresi Lambda, C 20 memperkenalkan konsep dan coroutin, dan akan memberi tumpuan kepada pengaturcaraan prestasi dan sistem pada masa akan datang. 2.C# telah dikeluarkan oleh Microsoft pada tahun 2000. Menggabungkan kelebihan C dan Java, evolusinya memberi tumpuan kepada kesederhanaan dan produktiviti. Sebagai contoh, C#2.0 memperkenalkan generik dan C#5.0 memperkenalkan pengaturcaraan tak segerak, yang akan memberi tumpuan kepada produktiviti pemaju dan pengkomputeran awan pada masa akan datang.

Terdapat perbezaan yang signifikan dalam lengkung pembelajaran C# dan C dan pengalaman pemaju. 1) Keluk pembelajaran C# agak rata dan sesuai untuk pembangunan pesat dan aplikasi peringkat perusahaan. 2) Keluk pembelajaran C adalah curam dan sesuai untuk senario kawalan berprestasi tinggi dan rendah.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Dreamweaver CS6
Alat pembangunan web visual

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
