Minimum cost to form a number X by adding up powers of 2

Given an array arr[] of N integers and an integer X. Element arr[i] in array denotes the cost to use 2i. The task is to find the minimum cost to choose the numbers which add up to X.

Examples:

Input: arr[] = { 20, 50, 60, 90 }, X = 7
Output: 120
22 + 21 + 20 = 4 + 2 + 1 = 7 with cost = 60 + 50 + 20 = 130
But we can use 22 + 3 * 20 = 4 + 3 * 1 = 7 with cost = 60 + 3 * 20 = 120 which is minimum possible.



Input: arr[] = { 10, 5, 50 }, X = 4
Output: 10

Approach: The problem can be solved using basic Dynamic Programming. The fact that every number can be formed using powers of 2 has been used here. We can initially calculate the minimal cost required to form powers of 2 themselves. The recurrence will be as follows:

a[i] = min(a[i], 2 * a[i – 1])

Once the array is re-computed, we can simply keep adding the cost according to the set bits in the number X.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the minimum cost
int MinimumCost(int a[], int n, int x)
{
  
    // Re-compute the array
    for (int i = 1; i < n; i++) {
        a[i] = min(a[i], 2 * a[i - 1]);
    }
  
    int ind = 0;
  
    int sum = 0;
  
    // Add answers for set bits
    while (x) {
  
        // If bit is set
        if (x & 1)
            sum += a[ind];
  
        // Increase the counter
        ind++;
  
        // Right shift the number
        x = x >> 1;
    }
  
    return sum;
}
  
// Driver code
int main()
{
    int a[] = { 20, 50, 60, 90 };
    int x = 7;
    int n = sizeof(a) / sizeof(a[0]);
    cout << MinimumCost(a, n, x);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.io.*;
  
class GFG 
{
      
// Function to return the minimum cost
static int MinimumCost(int a[], int n, int x)
{
  
    // Re-compute the array
    for (int i = 1; i < n; i++) 
    {
        a[i] = Math.min(a[i], 2 * a[i - 1]);
    }
  
    int ind = 0;
  
    int sum = 0;
  
    // Add answers for set bits
    while (x > 0
    {
  
        // If bit is set
        if (x != 0 )
            sum += a[ind];
  
        // Increase the counter
        ind++;
  
        // Right shift the number
        x = x >> 1;
    }
  
    return sum;
}
  
// Driver code
public static void main (String[] args) 
{
  
    int a[] = { 20, 50, 60, 90 };
    int x = 7;
    int n =a.length;
    System.out.println (MinimumCost(a, n, x));
}
}
  
// This Code is contributed by akt_mit 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 implementation of the approach
  
# Function to return the minimum cost
def MinimumCost(a, n, x):
      
    # Re-compute the array
    for i in range(1, n, 1):
        a[i] = min(a[i], 2 * a[i - 1])
  
    ind = 0
  
    sum = 0
  
    # Add answers for set bits
    while (x):
          
        # If bit is set
        if (x & 1):
            sum += a[ind]
  
        # Increase the counter
        ind += 1
  
        # Right shift the number
        x = x >> 1
  
    return sum
  
# Driver code
if __name__ == '__main__':
    a = [20, 50, 60, 90]
    x = 7
    n = len(a)
    print(MinimumCost(a, n, x))
  
# This code is contributed by
# Surendra_Gangwar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG 
{
      
// Function to return the minimum cost
public static int MinimumCost(int []a, int n, int x)
{
  
    // Re-compute the array
    for (int i = 1; i < n; i++) 
    {
        a[i] = Math.Min(a[i], 2 * a[i - 1]);
    }
  
    int ind = 0;
  
    int sum = 0;
  
    // Add answers for set bits
    while (x > 0) 
    {
  
        // If bit is set
        if (x != 0 )
            sum += a[ind];
  
        // Increase the counter
        ind++;
  
        // Right shift the number
        x = x >> 1;
    }
  
    return sum;
}
  
// Driver code
public static void Main () 
{
  
    int []a = { 20, 50, 60, 90 };
    int x = 7;
    int n =a.Length;
    Console.WriteLine(MinimumCost(a, n, x));
}
}
  
// This Code is contributed by SoM15242

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
  
// PHP implementation of the approach
// Function to return the minimum cost
  
function MinimumCost($a, $n, $x)
{
  
    // Re-compute the array
    for ($i = 1; $i < $n; $i++) 
    {
        $a[$i] = min($a[$i], 2 * $a[$i - 1]);
    }
  
    $ind = 0;
  
    $sum = 0;
  
    // Add answers for set bits
    while ($x)
    {
  
        // If bit is set
        if ($x & 1)
            $sum += $a[$ind];
  
        // Increase the counter
        $ind++;
  
        // Right shift the number
        $x = $x >> 1;
    }
  
    return $sum;
}
  
    // Driver code
    $a = array( 20, 50, 60, 90 );
    $x = 7;
    $n = sizeof($a) / sizeof($a[0]);
    echo MinimumCost($a, $n, $x);
  
// This code is contributed by ajit.
?>

chevron_right


Output:

120


My Personal Notes arrow_drop_up

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.