The task is to generate a binary string of length N using branch and bound technique Examples:
Input: N = 3 Output: 000 001 010 011 100 101 110 111 Explanation: Numbers with 3 binary digits are 0, 1, 2, 3, 4, 5, 6, 7 Input: N = 2 Output: 00 01 10 11
Approach: Generate Combinations using Branch and Bound :
- It starts with an empty solution vector.
- While Queue is not empty remove partial vector from queue.
- If it is a final vector print the combination else,
- For the next component of partial vector create k child vectors by fixing all possible states for the next component insert vectors into the queue.
Below is the implementation of the above approachÂ
C++
// CPP Program to generate // Binary Strings using Branch and Bound #include <bits/stdc++.h> using namespace std; Â
// Creating a Node class class Node { public : Â Â Â Â int *soln; Â Â Â Â int level; Â Â Â Â vector<Node *> child; Â Â Â Â Node *parent; Â
    Node(Node *parent, int level, int N)     {         this ->parent = parent;         this ->level = level;         this ->soln = new int [N];     } }; Â
// Utility function to generate binary strings of length n void generate(Node *n, int &N, queue<Node *> &Q) {     // If list is full print combination     if (n->level == N)     {         for ( int i = 0; i < N; i++)             cout << n->soln[i];         cout << endl;     }     else     {         int l = n->level; Â
        // iterate while length is not equal to n         for ( int i = 0; i <= 1; i++)         {             Node *x = new Node(n, l + 1, N);             for ( int k = 0; k < l; k++)                 x->soln[k] = n->soln[k];             x->soln[l] = i;             n->child.push_back(x);             Q.push(x);         }     } } Â
// Driver Code int main() {     // Initiate Generation     // Create a root Node     int N = 3;     Node *root;     root = new Node(NULL, 0, N); Â
    // Queue that maintains the list of live Nodes     queue<Node *> Q;          // Instantiate the Queue     Q.push(root); Â
    while (!Q.empty())     {         Node *E = Q.front();         Q.pop();         generate(E, N, Q);     } Â
    return 0; } Â
// This code is contributed by // sanjeev2552 |
Java
// Java Program to generate // Binary Strings using Branch and Bound Â
import java.io.*; import java.util.*; Â
// Creating a Node class class Node { Â
    int soln[];     int level;     ArrayList<Node> child;     Node parent; Â
    Node(Node parent, int level, int N)     {         this .parent = parent;         this .level = level;         this .soln = new int [N];     } } Â
class GFG { Â
    static int N; Â
    // Queue that maintains the list of live Nodes     public static Queue<Node> Q; Â
    // Utility function to generate binary strings of length n     public static void generate(Node n)     {         // If list is full print combination         if (n.level == N) {             for ( int i = 0 ; i <= N - 1 ; i++) {                 System.out.print(n.soln[i]);             }             System.out.println();         }         else { Â
            // Create a new vector for new combination             n.child = new ArrayList<Node>(); Â
            int l = n.level; Â
            // iterate while length is not equal to n             for ( int i = 0 ; i <= 1 ; i++) {                 Node x = new Node(n, l + 1 , N);                 for ( int k = 0 ; k < l; k++) {                     x.soln[k] = n.soln[k];                 }                 x.soln[l] = i;                 n.child.add(x);                 Q.add(x);             }         }     } Â
    // Driver code     public static void main(String args[])     {         // Initiate Generation         // Create a root Node         N = 3 ;         Node root = new Node( null , 0 , N); Â
        // Instantiate the Queue         Q = new LinkedList<Node>();         Q.add(root); Â
        while (Q.size() != 0 ) {             Node E = Q.poll();             generate(E);         }     } } |
Python3
from queue import Queue Â
# Creating a Node class class Node:     def __init__( self , parent, level, N):         self .parent = parent         self .level = level         self .soln = [ 0 ] * N         self .child = [] Â
# Queue that maintains the list of live Nodes Q = Queue() Â
# Utility function to generate binary strings of length n def generate(n):     # If list is full print combination     if n.level = = N:         print (''.join( str (x) for x in n.soln))     else :         # Create a new list for new combination         n.child = [] Â
        l = n.level Â
        # iterate while length is not equal to n         for i in range ( 2 ):             x = Node(n, l + 1 , N)             x.soln[:l] = n.soln[:l]             x.soln[l] = i             n.child.append(x)             Q.put(x) Â
# Driver code if __name__ = = '__main__' :     # Initiate Generation     # Create a root Node     N = 3     root = Node( None , 0 , N) Â
    # Instantiate the Queue     Q.put(root) Â
    while not Q.empty():         E = Q.get()         generate(E) |
C#
// C# Program to generate // Binary Strings using Branch and Bound using System; using System.Collections.Generic; Â
// Creating a Node class public class Node { Â Â Â Â public int []soln; Â Â Â Â public int level; Â Â Â Â public List<Node> child; Â Â Â Â public Node parent; Â
    public Node(Node parent,                 int level, int N)     {         this .parent = parent;         this .level = level;         this .soln = new int [N];     } } Â
class GFG { Â Â Â Â static int N; Â
    // Queue that maintains the list of live Nodes     public static Queue<Node> Q; Â
    // Utility function to generate     // binary strings of length n     public static void generate(Node n)     {         // If list is full print combination         if (n.level == N)         {             for ( int i = 0; i <= N - 1; i++)             {                 Console.Write(n.soln[i]);             }             Console.WriteLine();         }         else         { Â
            // Create a new vector for new combination             n.child = new List<Node>(); Â
            int l = n.level; Â
            // iterate while length is not equal to n             for ( int i = 0; i <= 1; i++)             {                 Node x = new Node(n, l + 1, N);                 for ( int k = 0; k < l; k++)                 {                     x.soln[k] = n.soln[k];                 }                 x.soln[l] = i;                 n.child.Add(x);                 Q.Enqueue(x);             }         }     } Â
    // Driver code     public static void Main(String []args)     {         // Initiate Generation         // Create a root Node         N = 3;         Node root = new Node( null , 0, N); Â
        // Instantiate the Queue         Q = new Queue<Node>();         Q.Enqueue(root); Â
        while (Q.Count != 0)         {             Node E = Q.Dequeue();             generate(E);         }     } } Â
// This code is contributed by Rajput-Ji |
Javascript
// Javascript code for the above approach Â
// Creating a Node class class Node { Â Â constructor(parent, level, N) { Â Â Â Â this .parent = parent; Â Â Â Â this .level = level; Â Â Â Â this .soln = new Array(N).fill(0); Â Â Â Â this .child = []; Â Â } } Â
// Queue that maintains the list of live Nodes const Q = []; Â
// Utility function to generate binary strings of length n function generate(n, N) {   // If list is full print combination   if (n.level === N) {     console.log(n.soln.join( "" ));   } else {     // Create a new list for new combination     n.child = []; Â
    const l = n.level; Â
    // iterate while length is not equal to n     for (let i = 0; i < 2; i++) {       const x = new Node(n, l + 1, N);       x.soln = n.soln.slice();       x.soln[l] = i;       n.child.push(x);       Q.push(x);     }   } } Â
// Driver code (() => {   // Initiate Generation   // Create a root Node   const N = 3;   const root = new Node( null , 0, N); Â
  // Instantiate the Queue   Q.push(root); Â
  while (Q.length > 0) {     const E = Q.shift();     generate(E, N);   } })(); Â
Â
// This code is contributed by sdeadityasharma |
000 001 010 011 100 101 110 111
Time Complexity:Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!