Find k numbers which are powers of 2 and have sum N | Set 1

Given two numbers N and K. The task is to print K numbers which are powers of 2 and their sum is N. Print -1 if not possible.

Examples:

Input: N = 9, K = 4
Output: 4 2 2 1
4 + 2 + 2 + 1 = 9 

Input: N = 4, K = 5
Output: -1 

Approach: The below algorithm can be followed to solve the above problem:

  • If the K is less than the number of set bits in N or more than the number N, then it is not possible.
  • Insert the powers of two at set bits into Priority Queue.
  • Iterate in the Priority Queue till we get K elements, pop() the topmost element and
  • push()
  • element/2 twice into the Priority Queue again.

  • Once K elements are achieved, print them.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find k numbers that 
// are power of 2 and have sum equal 
// to N
#include <bits/stdc++.h>
using namespace std;
  
// function to print numbers
void printNum(int n, int k)
{
    // Count the number of set bits
    int x = __builtin_popcount(n);
  
    // Not-possible condition
    if (k < x || k > n) {
        cout << "-1";
        return;
    }
  
    // Stores the number
    priority_queue<int> pq;
  
    // Get the set bits
    int two = 1;
    while (n) {
        if (n & 1) {
            pq.push(two);
        }
  
        two = two * 2;
        n = n >> 1;
    }
  
    // Iterate till we get K elements
    while (pq.size() < k) {
  
        // Get the topmost element
        int el = pq.top();
        pq.pop();
  
        // Push the elements/2 into 
        // priority queue
        pq.push(el / 2);
        pq.push(el / 2);
    }
  
    // Print all elements
    int ind = 0;
    while (ind < k) {
        cout << pq.top() << " ";
        pq.pop();
        ind++;
    }
}
  
// Driver Code
int main()
{
    int n = 9, k = 4;
    printNum(n, k);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find k numbers that 
// are power of 2 and have sum equal 
// to N 
import java.io.*;
import java.util.*;
  
class GFG 
{
  
    // function to print numbers
    static void printNum(int n, int k)
    {
  
        // Count the number of set bits
        String str = Integer.toBinaryString(n);
        int x = 0;
        for (int i = 0; i < str.length(); i++)
            if (str.charAt(i) == '1')
                x++;
  
        // Not-possible condition
        if (k < x || k > n)
        {
            System.out.println("-1");
            return;
        }
  
        // Stores the number
        PriorityQueue<Integer> pq = 
        new PriorityQueue<>(Comparator.reverseOrder());
  
        // Get the set bits
        int two = 1;
        while (n > 0
        {
            if ((n & 1) == 1)
                pq.add(two);
            two *= 2;
            n = n >> 1;
        }
  
        // Iterate till we get K elements
        while (pq.size() < k)
        {
  
            // Get the topmost element
            int el = pq.poll();
  
            // Push the elements/2 into
            // priority queue
            pq.add(el / 2);
            pq.add(el / 2);
        }
  
        // Print all elements
        int ind = 0;
        while (ind < k) 
        {
            System.out.print(pq.poll() + " ");
            ind++;
        }
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int n = 9, k = 4;
        printNum(n, k);
    }
}
  
// This code is contributed by
// sanjeev2552

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to find k numbers that 
# are power of 2 and have sum equal 
# to N 
  
# function to prnumbers 
def printNum(n, k):
      
    # Count the number of set bits 
    x = 0
    m = n
    while (m): 
        x += m & 1
        m >>= 1
      
    # Not-possible condition 
    if k < x or k > n:
        print("-1")
        return
      
    # Stores the number 
    pq = []
      
    # Get the set bits 
    two = 1
    while (n):
        if (n & 1):
            pq.append(two) 
              
        two = two * 2
        n = n >> 1
          
    # Iterate till we get K elements 
    while (len(pq) < k):
      
        # Get the topmost element 
        el = pq[-1]
        pq.pop()
  
        # append the elements/2 into 
        # priority queue 
        pq.append(el // 2
        pq.append(el // 2)
          
    # Prall elements 
    ind = 0
    pq.sort()
    while (ind < k):
        print(pq[-1], end = " ")
        pq.pop()
        ind += 1
  
# Driver Code 
n = 9
k = 4
printNum(n, k) 
  
# This code is contributed by SHUBHAMSINGH10

chevron_right


Output:

4 2 2 1

Represent n as the sum of exactly k powers of two | Set 2

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.