Open In App

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

Last Updated : 15 Jun, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

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++




// 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;
}


Java




// 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


Python3




# 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


C#




// 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


PHP




<?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.
?>


Javascript




<script>
 
// Javascript 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] = Math.min(a[i], 2 * a[i - 1]);
        }
 
        var ind = 0;
 
        var 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
     
 
        var a = [ 20, 50, 60, 90 ];
        var x = 7;
        var n = a.length;
        document.write(MinimumCost(a, n, x));
 
// This code contributed by umadevi9616
 
</script>


Output: 

120

 

Time Complexity: O(N + log(x)), as we are using a loop to traverse N times and log(x) times as in every traversal we are right shifting x by 1 bit which will be equivalent to log(x).

Auxiliary Space: O(1), as we are not using any extra space.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads