Minimum cost to reduce given number to less than equal to zero
Last Updated :
07 Oct, 2023
Given array A[] and B[] of size N representing N type of operations. Given a number H, reduce this number to less than equal to 0 by performing the following operation at minimum cost. Choose ith operation and subtract A[i] from H and the cost incurred will be B[i]. Every operation can be performed any number of times.
Examples:
Input: A[] = {8, 4, 2}, B[] = {3, 2, 1}, H = 9
Output: 4
Explanation: The optimal way to solve this problem is to decrease the number H = 9 by the first operation reducing it by A[1] = 8 and the cost incurred is B[1] = 3. H is now 1. Use the third operation to reduce H = 1 by A[3] = 2 cost incurred will be B[3] = 1. Now H is -1 which is less than equal to 0 hence. in cost = 3 + 1 = 4 number H can be made less than equal to 0.
Input: A[] = {1, 2, 3, 4, 5, 6}, B[] = {1, 3, 9, 27, 81, 243}, H = 100
Output: 100
Explanation: It is optimal to use the first operation 100 times to make H zero in minimum cost.
Naive approach: The basic way to solve the problem is as follows:
The basic way to solve this problem is to generate all possible combinations by using a recursive approach.
Time Complexity: O(HN)
Auxiliary Space: O(1)
Another approach : Recursive + Memoization
In this approach we find our answer with the help of recursion but to avoid recomputing of same problem we use use a vector memo to store the computations of subproblems.
Implementation :
C++
#include <bits/stdc++.h>
using namespace std;
int findMinimumCost( int A[], int B[], int N, int H,
vector< int >& memo)
{
if (H <= 0) {
return 0;
}
if (memo[H] != -1) {
return memo[H];
}
int ans = INT_MAX;
for ( int i = 0; i < N; i++) {
ans = min(ans,
findMinimumCost(A, B, N, H - A[i], memo)
+ B[i]);
}
memo[H] = ans;
return ans;
}
int main()
{
int A[] = { 8, 4, 2 }, B[] = { 3, 2, 1 }, H = 9;
int N = sizeof (A) / sizeof (A[0]);
vector< int > memo(H + 1, -1);
cout << findMinimumCost(A, B, N, H, memo) << endl;
int A1[] = { 1, 2, 3, 4, 5, 6 },
B1[] = { 1, 3, 9, 27, 81, 243 }, H1 = 100;
int N1 = sizeof (A1) / sizeof (A1[0]);
vector< int > memo1(H1 + 1, -1);
cout << findMinimumCost(A1, B1, N1, H1, memo1) << endl;
return 0;
}
|
Java
import java.util.Arrays;
public class GFG {
public static int findMinimumCost( int [] A, int [] B,
int N, int H,
int [] memo)
{
if (H <= 0 ) {
return 0 ;
}
if (memo[H] != - 1 ) {
return memo[H];
}
int ans = Integer.MAX_VALUE;
for ( int i = 0 ; i < N; i++) {
ans = Math.min(ans, findMinimumCost(
A, B, N, H - A[i], memo)
+ B[i]);
}
memo[H] = ans;
return ans;
}
public static void main(String[] args)
{
int [] A = { 8 , 4 , 2 };
int [] B = { 3 , 2 , 1 };
int H = 9 ;
int N = A.length;
int [] memo = new int [H + 1 ];
Arrays.fill(memo, - 1 );
System.out.println(
findMinimumCost(A, B, N, H, memo));
int [] A1 = { 1 , 2 , 3 , 4 , 5 , 6 };
int [] B1 = { 1 , 3 , 9 , 27 , 81 , 243 };
int H1 = 100 ;
int N1 = A1.length;
int [] memo1 = new int [H1 + 1 ];
Arrays.fill(memo1, - 1 );
System.out.println(
findMinimumCost(A1, B1, N1, H1, memo1));
}
}
|
Python
def findMinimumCost(A, B, N, H, memo):
if H < = 0 :
return 0
if memo[H] ! = - 1 :
return memo[H]
ans = float ( 'inf' )
for i in range (N):
ans = min (ans, findMinimumCost(A, B, N, H - A[i], memo) + B[i])
memo[H] = ans
return ans
if __name__ = = "__main__" :
A = [ 8 , 4 , 2 ]
B = [ 3 , 2 , 1 ]
H = 9
N = len (A)
memo = [ - 1 ] * (H + 1 )
print (findMinimumCost(A, B, N, H, memo))
A1 = [ 1 , 2 , 3 , 4 , 5 , 6 ]
B1 = [ 1 , 3 , 9 , 27 , 81 , 243 ]
H1 = 100
N1 = len (A1)
memo1 = [ - 1 ] * (H1 + 1 )
print (findMinimumCost(A1, B1, N1, H1, memo1))
|
C#
using System;
using System.Collections.Generic;
class Gfg
{
static int findMinimumCost( int [] A, int [] B, int N, int H, List< int > memo)
{
if (H <= 0)
{
return 0;
}
if (memo[H] != -1)
{
return memo[H];
}
int ans = int .MaxValue;
for ( int i = 0; i < N; i++)
{
ans = Math.Min(ans, findMinimumCost(A, B, N, H - A[i], memo) + B[i]);
}
memo[H] = ans;
return ans;
}
static void Main( string [] args)
{
int [] A = { 8, 4, 2 };
int [] B = { 3, 2, 1 };
int H = 9;
int N = A.Length;
List< int > memo = new List< int >( new int [H + 1]);
for ( int i = 0; i <= H; i++)
{
memo[i] = -1;
}
Console.WriteLine(findMinimumCost(A, B, N, H, memo));
int [] A1 = { 1, 2, 3, 4, 5, 6 };
int [] B1 = { 1, 3, 9, 27, 81, 243 };
int H1 = 100;
int N1 = A1.Length;
List< int > memo1 = new List< int >( new int [H1 + 1]);
for ( int i = 0; i <= H1; i++)
{
memo1[i] = -1;
}
Console.WriteLine(findMinimumCost(A1, B1, N1, H1, memo1));
}
}
|
Javascript
function findMinimumCost(A, B, N, H, memo)
{
if (H <= 0) {
return 0;
}
if (memo[H] != -1) {
return memo[H];
}
let ans = Number.MAX_VALUE;
for (let i = 0; i < N; i++) {
ans = Math.min(ans,
findMinimumCost(A, B, N, H - A[i], memo)
+ B[i]);
}
memo[H] = ans;
return ans;
}
let A = [ 8, 4, 2 ], B = [ 3, 2, 1 ], H = 9;
let N = A.length;
let memo= new Array(H + 1).fill(-1);
console.log(findMinimumCost(A, B, N, H, memo));
let A1 = [ 1, 2, 3, 4, 5, 6 ], B1 = [ 1, 3, 9, 27, 81, 243 ], H1 = 100;
let N1 = A1.length;
let memo1= new Array(H1 + 1).fill(-1);
console.log(findMinimumCost(A1, B1, N1, H1, memo1));
|
Time Complexity: O(N * H)
Auxiliary Space: O(H)
Efficient Approach: The above approach can be optimized based on the following idea:
Dynamic programming can be used to solve this problem
- dp[i] represents a minimum cost to make I zero from given operations
- recurrence relation: dp[i] = min(dp[i], dp[max(0, i – A[i])] + B[i])
Follow the steps below to solve the problem:
- Declare a dp table of size H + 1 with all values initialized to infinity
- Base case dp[0] = 0
- Iterate from 1 to H to calculate a value for each of them and to do that use all operations from 0 to j and try to make i zero by the minimum cost of these operations.
- Finally, return minimum cost dp[H]
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMinimumCost( int A[], int B[], int N, int H)
{
vector< int > dp(H + 1, INT_MAX);
dp[0] = 0;
for ( int i = 1; i <= H; i++) {
for ( int j = 0; j < N; j++) {
dp[i] = min(dp[i], dp[max(0, i - A[j])] + B[j]);
}
}
return dp[H];
}
int main()
{
int A[] = { 8, 4, 2 }, B[] = { 3, 2, 1 }, H = 9;
int N = sizeof (A) / sizeof (A[0]);
cout << findMinimumCost(A, B, N, H) << endl;
int A1[] = { 1, 2, 3, 4, 5, 6 },
B1[] = { 1, 3, 9, 27, 81, 243 }, H1 = 100;
int N1 = sizeof (A1) / sizeof (A1[0]);
cout << findMinimumCost(A1, B1, N1, H1) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
public static int findMinimumCost( int A[], int B[],
int N, int H)
{
int dp[] = new int [H + 1 ];
for ( int i = 0 ; i < H + 1 ; i++)
dp[i] = Integer.MAX_VALUE;
dp[ 0 ] = 0 ;
for ( int i = 1 ; i <= H; i++) {
for ( int j = 0 ; j < N; j++) {
int x = Math.max( 0 , i - A[j]);
dp[i] = Math.min(dp[i],
dp[x]
+ B[j]);
}
}
return dp[H];
}
public static void main(String[] args)
{
int A[] = { 8 , 4 , 2 }, B[] = { 3 , 2 , 1 }, H = 9 ;
int N = A.length;
System.out.println(findMinimumCost(A, B, N, H));
int A1[] = { 1 , 2 , 3 , 4 , 5 , 6 },
B1[] = { 1 , 3 , 9 , 27 , 81 , 243 }, H1 = 100 ;
int N1 = A1.length;
System.out.println(findMinimumCost(A1, B1, N1, H1));
}
}
|
Python3
import sys
def findMinimumCost(A, B, N, H):
dp = [sys.maxsize] * (H + 1 )
dp[ 0 ] = 0
for i in range ( 1 , H + 1 ):
for j in range (N):
dp[i] = min (dp[i], dp[ max ( 0 , i - A[j])] + B[j])
return dp[H]
A = [ 8 , 4 , 2 ]
B = [ 3 , 2 , 1 ]
H = 9
N = len (A)
print (findMinimumCost(A, B, N, H))
A1 = [ 1 , 2 , 3 , 4 , 5 , 6 ]
B1 = [ 1 , 3 , 9 , 27 , 81 , 243 ]
H1 = 100
N1 = len (A)
print (findMinimumCost(A1, B1, N1, H1))
|
C#
using System;
using System.Collections.Generic;
public class Gfg {
static int findMinimumCost( int [] A, int [] B, int N, int H)
{
int [] dp = new int [H + 1];
for ( int i = 0; i < H + 1; i++)
dp[i] = 2147483647;
dp[0] = 0;
for ( int i = 1; i <= H; i++) {
for ( int j = 0; j < N; j++) {
int x = Math.Max(0, i - A[j]);
dp[i] = Math.Min(dp[i], dp[x] + B[j]);
}
}
return dp[H];
}
public static void Main( string [] args)
{
int [] A = { 8, 4, 2 };
int [] B = { 3, 2, 1 };
int H = 9;
int N = A.Length;
Console.WriteLine(findMinimumCost(A, B, N, H));
int [] A1 = { 1, 2, 3, 4, 5, 6 };
int [] B1 = { 1, 3, 9, 27, 81, 243 };
int H1 = 100;
int N1 = A1.Length;
Console.WriteLine(findMinimumCost(A1, B1, N1, H1));
}
}
|
Javascript
function findMinimumCost(A, B, N, H) {
let dp = new Array(H + 1).fill(Number.MAX_VALUE);
dp[0] = 0;
for (let i = 1; i <= H; i++) {
for (let j = 0; j < N; j++) {
let x = Math.max(0, i - A[j]);
dp[i] = Math.min(dp[i], dp[x] + B[j]);
}
}
return dp[H];
}
let A = [8, 4, 2], B = [3, 2, 1], H = 9;
let N = A.length;
console.log(findMinimumCost(A, B, N, H) + "<br>" );
let A1 = [1, 2, 3, 4, 5, 6],
B1 = [1, 3, 9, 27, 81, 243], H1 = 100;
let N1 = A1.length;
console.log(findMinimumCost(A1, B1, N1, H1) + "<br>" );
|
Time Complexity: O(N * H)
Auxiliary Space: O(N * H)
Related Articles:
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...