Jadual Kandungan
Contoh Contoh
Arahan
Kaedah 1
Algoritma
Contoh
Output
Cara menggunakan Bitset
Kesimpulan
Rumah pembangunan bahagian belakang C++ Bina rentetan perduaan panjang K daripada tatasusunan mengikut keadaan yang diberikan

Bina rentetan perduaan panjang K daripada tatasusunan mengikut keadaan yang diberikan

Sep 09, 2023 pm 07:45 PM
binari tatasusunan membina

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
Salin selepas log masuk
Output – 1110
Salin selepas log masuk

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
Salin selepas log masuk
Output – 111110000
Salin selepas log masuk

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
Salin selepas log masuk
Output – 011011
Salin selepas log masuk

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;
}
Salin selepas log masuk

Output

The constructed binary string of length 9 according to the given conditions is 111110000
Salin selepas log masuk

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);
}
Salin selepas log masuk

Output

The constructed binary string of length 8 according to the given conditions is 11111110
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengalih keluar elemen pendua dari tatasusunan PHP menggunakan gelung foreach? Bagaimana untuk mengalih keluar elemen pendua dari tatasusunan PHP menggunakan gelung foreach? Apr 27, 2024 am 11:33 AM

Kaedah menggunakan gelung foreach untuk mengalih keluar elemen pendua daripada tatasusunan PHP adalah seperti berikut: melintasi tatasusunan, dan jika elemen itu sudah wujud dan kedudukan semasa bukan kejadian pertama, padamkannya. Contohnya, jika terdapat rekod pendua dalam hasil pertanyaan pangkalan data, anda boleh menggunakan kaedah ini untuk mengalih keluarnya dan mendapatkan hasil tanpa rekod pendua.

Seni PHP Array Deep Copy: Menggunakan Kaedah Berbeza untuk Mencapai Salinan Sempurna Seni PHP Array Deep Copy: Menggunakan Kaedah Berbeza untuk Mencapai Salinan Sempurna May 01, 2024 pm 12:30 PM

Kaedah untuk tatasusunan penyalinan dalam dalam PHP termasuk: Pengekodan dan penyahkodan JSON menggunakan json_decode dan json_encode. Gunakan peta_tatasusunan dan klon untuk membuat salinan kunci dan nilai yang mendalam. Gunakan bersiri dan menyahsiri untuk bersiri dan menyahsiri.

Pembalikan nilai kunci tatasusunan PHP: analisis perbandingan prestasi kaedah yang berbeza Pembalikan nilai kunci tatasusunan PHP: analisis perbandingan prestasi kaedah yang berbeza May 03, 2024 pm 09:03 PM

Perbandingan prestasi kaedah membalik nilai kunci tatasusunan PHP menunjukkan bahawa fungsi array_flip() berprestasi lebih baik daripada gelung for dalam tatasusunan besar (lebih daripada 1 juta elemen) dan mengambil masa yang lebih singkat. Kaedah gelung untuk membalikkan nilai kunci secara manual mengambil masa yang agak lama.

Aplikasi fungsi pengelompokan tatasusunan PHP dalam pengisihan data Aplikasi fungsi pengelompokan tatasusunan PHP dalam pengisihan data May 04, 2024 pm 01:03 PM

Fungsi array_group_by PHP boleh mengumpulkan elemen dalam tatasusunan berdasarkan kekunci atau fungsi penutupan, mengembalikan tatasusunan bersekutu dengan kuncinya ialah nama kumpulan dan nilainya ialah tatasusunan elemen kepunyaan kumpulan.

Amalan Terbaik untuk Menyalin Dalam Tatasusunan PHP: Temui Kaedah Cekap Amalan Terbaik untuk Menyalin Dalam Tatasusunan PHP: Temui Kaedah Cekap Apr 30, 2024 pm 03:42 PM

Amalan terbaik untuk melaksanakan salinan dalam tatasusunan dalam PHP ialah menggunakan json_decode(json_encode($arr)) untuk menukar tatasusunan kepada rentetan JSON dan kemudian menukarnya kembali kepada tatasusunan. Gunakan unserialize(serialize($arr)) untuk mensiri tatasusunan kepada rentetan dan kemudian menyahsirikannya kepada tatasusunan baharu. Gunakan RecursiveIteratorIterator untuk melintasi tatasusunan berbilang dimensi secara rekursif.

Amalan pengisihan pelbagai dimensi tatasusunan PHP: daripada senario mudah kepada kompleks Amalan pengisihan pelbagai dimensi tatasusunan PHP: daripada senario mudah kepada kompleks Apr 29, 2024 pm 09:12 PM

Pengisihan tatasusunan berbilang dimensi boleh dibahagikan kepada pengisihan lajur tunggal dan pengisihan bersarang. Pengisihan lajur tunggal boleh menggunakan fungsi array_multisort() untuk mengisih mengikut lajur pengisihan bersarang memerlukan fungsi rekursif untuk merentasi tatasusunan dan mengisihnya. Kes praktikal termasuk pengisihan mengikut nama produk dan pengisihan kompaun mengikut volum jualan dan harga.

Algoritma penggabungan tatasusunan PHP dan penyahduplikasian: penyelesaian selari Algoritma penggabungan tatasusunan PHP dan penyahduplikasian: penyelesaian selari Apr 18, 2024 pm 02:30 PM

Algoritma penggabungan tatasusunan dan penyahduplikasian PHP menyediakan penyelesaian selari, membahagikan tatasusunan asal kepada blok kecil untuk pemprosesan selari, dan proses utama menggabungkan hasil blok untuk nyahduplikasi. Langkah-langkah algoritma: Pisahkan tatasusunan asal kepada blok kecil yang diperuntukkan sama. Proses setiap blok untuk penyahduplikasian secara selari. Gabungkan hasil blok dan nyahduplikasi semula.

Peranan fungsi pengelompokan tatasusunan PHP dalam mencari elemen pendua Peranan fungsi pengelompokan tatasusunan PHP dalam mencari elemen pendua May 05, 2024 am 09:21 AM

Fungsi array_group() PHP boleh digunakan untuk mengumpulkan tatasusunan dengan kunci yang ditentukan untuk mencari elemen pendua. Fungsi ini berfungsi melalui langkah berikut: Gunakan key_callback untuk menentukan kunci kumpulan. Secara pilihan, gunakan value_callback untuk menentukan nilai kumpulan. Kira elemen terkumpul dan kenal pasti pendua. Oleh itu, fungsi array_group() sangat berguna untuk mencari dan memproses elemen pendua.

See all articles