Given an array arr[] consisting of N integers, and an integer K, the task is to construct a binary string of length K satisfying the following conditions:
- The character at ith index is ‘1′ if a subset with sum i can be formed from the array.
- Otherwise, the character at ith index is ‘0’.
Examples:
Input: arr[] = {1, 4}, K = 5
Output: 10011
Explanation:
Character at 1st index can be made by ‘1’ considering the subset {1}.
Character at 4th index can be made by ‘1’ considering the subset {4}.
Character at 5th index can be made by ‘1’ considering the subset {1, 4}.Input: arr[] = {1, 6, 1}, K = 8
Output: 11000111
Approach: The idea is to use a greedy approach to solve this problem. Below are the steps:
- Initialize a bitset, say bit[], of size 105 + 5 and set bit[0] = 1.
- Traverse through the array and for each array element arr[i], update bit as bit |= bit << arr[i] to have bit p if p can be obtained as a subset sum.
- At ith iteration, bit[i] stores the initial sum and after performing bit << arr[i], all bits are shifted by arr[i]. Therefore, bit p becomes p + arr[i].
- Finally, bit | (bit << arr[i]) merges these two cases, whether to consider the ith position or not.
- Iterate from 1 to K and print every value bit[i] as the required binary string.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // To construct the // required binary string bitset<100003> bit; // Function to construct binary string // according to the given conditions void constructBinaryString( int arr[], int N, int K) { // Initialize with 1 bit[0] = 1; // Traverse the array for ( int i = 0; i < N; i++) { // To check if the i-th integer // needs to be considered or not bit |= bit << arr[i]; } // Print the binary string for ( int i = 1; i <= K; i++) { cout << bit[i]; } } // Driver Code int main() { // Given array int arr[] = { 1, 6, 1 }; // Size of the array int N = sizeof (arr) / sizeof (arr[0]); // Given K int K = 8; constructBinaryString(arr, N, K); } |
Java
// Java code to implement the approach import java.util.Arrays; class BinaryString { public static void main(String[] args) { // Given array int [] arr = { 1 , 6 , 1 }; // Size of the array int N = arr.length; // Given K int K = 8 ; constructBinaryString(arr, N, K); } // Function to construct binary string // according to the given conditions static void constructBinaryString( int [] arr, int N, int K) { // Initialize with 1 int bit = 1 ; // Traverse the array for ( int i = 0 ; i < N; i++) { // To check if the i-th integer // needs to be considered or not bit |= (bit << arr[i]); } // Print the binary string String binaryString = Integer.toBinaryString(bit); System.out.println(binaryString.substring( 1 , K)); } } // This code is contributed by phasing17 |
Python3
# Python program for the above approach # To construct the # required binary string #bit = [0]*100003 # Function to construct binary string # according to the given conditions def constructBinaryString(arr,N, K): # Initialize with 1 bit = 1 # Traverse the array for i in range ( 0 , N): # To check if the i-th eger # needs to be considered or not bit | = bit << arr[i] # Print the binary string #for i in range(1,K): # print(bit[i]) bit = bin (bit).replace( "0b" , "") print (bit[ 1 :K + 1 ]) # Driver Code # Given array arr = [ 1 , 6 , 1 ] # Size of the array N = len (arr) # Given K K = 8 constructBinaryString(arr, N, K) # This code is contributed by shubhamsingh10 |
C#
using System; using System.Linq; namespace BinaryString { class Program { static void Main( string [] args) { // Given array int [] arr = { 1, 6, 1 }; // Size of the array int N = arr.Length; // Given K int K = 8; ConstructBinaryString(arr, N, K); } // Function to construct binary string // according to the given conditions static void ConstructBinaryString( int [] arr, int N, int K) { // Initialize with 1 int bit = 1; // Traverse the array for ( int i = 0; i < N; i++) { // To check if the i-th integer // needs to be considered or not bit |= (bit << arr[i]); } // Print the binary string string binaryString = Convert.ToString(bit, 2); Console.WriteLine(binaryString.Substring(1, K)); } } } // This code is contributed by phasing17. |
Javascript
// JavaScript program for the above approach // To construct the // required binary string //bit = [0]*100003 // Function to construct binary string // according to the given conditions function constructBinaryString(arr,N, K) { // Initialize with 1 let bit = 1 // Traverse the array for ( var i = 0; i < N; i++) // To check if the i-th eger // needs to be considered or not bit |= (bit << arr[i]) // Print the binary string //for i in range(1,K): // print(bit[i]) bit = bit.toString(2) console.log(bit.substring(1, K + 1)) } // Driver Code // Given array let arr = [1, 6, 1] // Size of the array let N = arr.length // Given K let K = 8 constructBinaryString(arr, N, K) // This code is contributed by phasing17 |
11000111
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!