在本教程中,我們需要建構一個長度為K 的二進位字串,如果使用陣列元素可以實現等於I 的子集和,則它的第i 個索引處應包含“1”。我們將學習兩種解決問題的方法。在第一種方法中,我們將使用動態規劃方法來檢查子集和等於索引「I」是否可能。在第二種方法中,我們將使用位集透過陣列元素來尋找所有可能的和。
問題陳述 - 我們給了一個包含 N 個整數的陣列。此外,我們還給出了表示二進位字串長度的整數 M。我們需要建立一個長度為 M 的二進位字串,使其遵循以下條件。
如果我們能從陣列中找到總和等於索引「I」的子集,則索引「I」處的字元為 1;否則為 0。
我從1開始的索引。
範例範例
Input – arr = [1, 2] M = 4
Output – 1110
說明
總和等於 1 的子集是 {1}。
總和等於 2 的子集是 {2}。
總和等於 3 的子集是 {1, 2}。
我們找不到總和等於 4 的子集,因此我們將 0 放在第 4 個索引處。
Input – arr = [1, 3, 1] M = 9
Output – 111110000
說明
我們可以創建所有可能的組合,以使總和在1到5之間。所以,前5個字元是1,最後4個字元是0。
Input – arr = [2, 6, 3] M = 6
Output – 011011
說明
使用陣列元素無法得到等於1和4的和,因此我們將0放置在第一個和第四個索引位置。
方法 1
在這個方法中,我們將使用動態規劃來檢查是否可以使用陣列元素來建構等於索引'I'的總和。我們將為每個索引檢查它,並將1或0附加到一個二進位字串中。
演算法
步驟 1 - 建立大小為 N 的向量並使用整數值對其進行初始化。另外,定義字串類型的“bin”變數並使用空字串對其進行初始化。
第二步 - 使用for迴圈使總迭代次數等於字串長度。
第三步 - 在for迴圈中,透過將陣列N和索引值作為參數來呼叫isSubsetSum()函數。
步驟 4 - 如果 isSubsetSum() 函數傳回 true,則將「1」附加到「bin」。否則,將“0”附加到“bin”。
第 5 步 - 定義 isSubsetSum() 函數以檢查是否可以使用陣列元素求和。
步驟 5.1 - 定義一個名為 dpTable 的二維向量。
步驟 5.2 - 將 'dpTable[i][0]' 初始化為 true,因為總和為零總是可能的。這裡,'I' 是索引值。
步驟 5.3 - 將 'dpTable [0] [j]' 初始化為 false,因為空數組的和是不可能的。
步驟 5.4 - 現在,使用兩個巢狀循環。第一個循環從1到N進行迭代,另一個循環從1到sum進行迭代。
步驟 5.5 - 在 for 迴圈中,如果目前元素的值大於總和,則忽略它。
步驟 5.6 − 否則,包括或排除元素以獲得總和。
步驟 5.7 − 傳回包含結果的 ‘dpTable[N][sum]’。
範例
#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; }
輸出
The constructed binary string of length 9 according to the given conditions is 111110000
時間複雜度 - O(N^3),因為 isSubsetSum() 的時間複雜度為 O(N^2),我們在驅動程式程式碼中呼叫它 N 次。
空間複雜度 - O(N^2),因為我們在isSubsetSum()函數中使用了一個二維向量。
使用Bitset的方法
在這種方法中,我們將使用位元集透過組合陣列的不同元素來尋找所有可能的總和值。這裡,bitset 意味著它創建一個二進位字串。在結果位集中,它的每一位都代表總和是否可能等於特定索引,我們需要在這裡找到它。
演算法
第 1 步 - 定義陣列和 M。此外,定義 createBinaryString() 函數。
第 2 步 - 接下來,定義所需長度的位元集,這將建立一個二進位字串。
第三步 - 將bit[0]初始化為1,因為總和為0總是可能的。
第 4 步 - 使用 for 迴圈迭代數組元素
#。
步驟 5 - 首先,對陣列元素執行「bit」左移操作。然後將結果值與位元值進行或運算。
步驟 6 − 從索引 1 到 M 列印位元集的值。
範例
#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); }
輸出
The constructed binary string of length 8 according to the given conditions is 11111110
時間複雜度 - O(N),因為我們使用單一 for 迴圈。
空間複雜度 - O(N),因為我們儲存了位元集的值。
結論
在這裡,我們優化了第二種方法,從空間和時間複雜度來看,它比第一種方法更好。然而,如果你沒有對位集的了解,第二種方法可能對初學者來說很難理解。
以上是根據給定條件,從數組建構一個長度為K的二進位字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 在現代編程中依然重要,因其高效、靈活和強大的特性。 1)C 支持面向對象編程,適用於系統編程、遊戲開發和嵌入式系統。 2)多態性是C 的亮點,允許通過基類指針或引用調用派生類方法,增強代碼的靈活性和可擴展性。

C#和C 在性能上的差異主要體現在執行速度和資源管理上:1)C 在數值計算和字符串操作上通常表現更好,因為它更接近硬件,沒有垃圾回收等額外開銷;2)C#在多線程編程上更為簡潔,但性能略遜於C ;3)選擇哪種語言應根據項目需求和團隊技術棧決定。

1)c relevantduetoItsAverity and效率和效果臨界。 2)theLanguageIsconTinuellyUped,withc 20introducingFeaturesFeaturesLikeTuresLikeSlikeModeLeslikeMeSandIntIneStoImproutiMimproutimprouteverusabilityandperformance.3)

C 在現代世界中的應用廣泛且重要。 1)在遊戲開發中,C 因其高性能和多態性被廣泛使用,如UnrealEngine和Unity。 2)在金融交易系統中,C 的低延遲和高吞吐量使其成為首選,適用於高頻交易和實時數據分析。

C 中有四種常用的XML庫:TinyXML-2、PugiXML、Xerces-C 和RapidXML。 1.TinyXML-2適合資源有限的環境,輕量但功能有限。 2.PugiXML快速且支持XPath查詢,適用於復雜XML結構。 3.Xerces-C 功能強大,支持DOM和SAX解析,適用於復雜處理。 4.RapidXML專注於性能,解析速度極快,但不支持XPath查詢。

C 通過第三方庫(如TinyXML、Pugixml、Xerces-C )與XML交互。 1)使用庫解析XML文件,將其轉換為C 可處理的數據結構。 2)生成XML時,將C 數據結構轉換為XML格式。 3)在實際應用中,XML常用於配置文件和數據交換,提升開發效率。

C#和C 的主要區別在於語法、性能和應用場景。 1)C#語法更簡潔,支持垃圾回收,適用於.NET框架開發。 2)C 性能更高,需手動管理內存,常用於系統編程和遊戲開發。

C#和C 的歷史與演變各有特色,未來前景也不同。 1.C 由BjarneStroustrup在1983年發明,旨在將面向對象編程引入C語言,其演變歷程包括多次標準化,如C 11引入auto關鍵字和lambda表達式,C 20引入概念和協程,未來將專注於性能和系統級編程。 2.C#由微軟在2000年發布,結合C 和Java的優點,其演變注重簡潔性和生產力,如C#2.0引入泛型,C#5.0引入異步編程,未來將專注於開發者的生產力和雲計算。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具