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:

Below is the implementation of the above approach:

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

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

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





Striver(underscore)79 at Codechef and codeforces D

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.



Article Tags :
Practice Tags :