Skip to content
Related Articles

Related Articles

Minimum cost to form a number X by adding up powers of 2
  • Difficulty Level : Medium
  • Last Updated : 07 May, 2021

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

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up
Recommended Articles
Page :