Minimize coins required to obtain all possible values up to N
Last Updated :
11 Oct, 2022
Given an integer N, the task is to find the minimum count of {1, 2, 5}-valued coins such that changes of all possible values in the range [1, N] can be formed and it is not possible to obtain values N.
Examples:
Input: N = 8
Output:
Count of 5 values coins: 0
Count of 2 rupees coins: 3
Count of 1 rupees coins: 2
Explanation:
Coins required for 1 cent = 1
Coins required for 2 cent = 1
Coins required for 3 cent = 2
Coins required for 4 cent = 2
Coins required for 5 cent = 3
Coins required for 6 cent = 3
Coins required for 7 cent = 4
Coins required for 8 cent = 5
Input: N = 17
Output:
Count of 5 rupees coins: 2
Count of 2 rupees coins: 3
Count of 1 rupees coins: 1
Approach: The problem can be solved using the greedy technique. The idea is based on the following observations:
Any number, X from the range [1, N] can be represented as
X = 5 * (Integer) + Y * (Integer)
Y is one of the values from the range [0, 4]
Follow the steps below to solve the problem:
- Initialize three variables, say F, T, and O, to store the count of 5 , 2 and 1-valued coins.
- Calculate count of 5-valued coins using F = (N – 4)/5.
- If (N – 5 * F) is even, then count of one valued coins can be calculated as O = 1.
- Otherwise, count of one valued coins can be calculated as O = 2.
- Calculate count of two valued coins can be calculated as T = (N – 5 * F – O) / 2.
- Finally, print values of F, T, and O.
Below is the implementation of the above approach:,
C++
#include <bits/stdc++.h>
using namespace std;
void find( int N)
{
int T, F, O;
F = int ((N - 4) / 5);
if (((N - 5 * F) % 2) == 0)
{
O = 2;
}
else
{
O = 1 ;
}
T = floor ((N - 5 * F - O)/2);
cout<< "Count of 5 valued coins: " << F << endl;
cout<< "Count of 2 valued coins: " << T<< endl;
cout<< "Count of 1 valued coins: " << O << endl;
}
int main()
{
int N = 8;
find(N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void find( int N)
{
int T, F, O;
F = ( int )((N - 4 ) / 5 );
if (((N - 5 * F) % 2 ) == 0 )
{
O = 2 ;
}
else
{
O = 1 ;
}
T = ( int )Math.floor((N - 5 * F - O)/ 2 );
System.out.println( "Count of 5 valued coins: " + F);
System.out.println( "Count of 2 valued coins: " + T);
System.out.println( "Count of 1 valued coins: " + O);
}
public static void main(String args[])
{
int N = 8 ;
find(N);
}
}
|
Python3
def find(N):
F = int ((N - 4 ) / 5 )
if ((N - 5 * F) % 2 ) = = 0 :
O = 2
else :
O = 1
T = (N - 5 * F - O) / / 2
print ( "Count of 5 valued coins: " , F)
print ( "Count of 2 valued coins: " , T)
print ( "Count of 1 valued coins: " , O)
if __name__ = = '__main__' :
N = 8
find(N)
|
C#
using System;
public class GFG
{
static void find( int N)
{
int T, F, O;
F = ( int )((N - 4) / 5);
if (((N - 5 * F) % 2) == 0)
{
O = 2;
}
else
{
O = 1 ;
}
T = ( int )Math.Floor(( double )(N - 5 * F - O)/2);
Console.WriteLine( "Count of 5 valued coins: " + F);
Console.WriteLine( "Count of 2 valued coins: " + T);
Console.WriteLine( "Count of 1 valued coins: " + O);
}
public static void Main(String []args)
{
int N = 8;
find(N);
}
}
|
Javascript
<script>
function find(N)
{
var T, F, O;
F = parseInt((N - 4) / 5);
if (((N - 5 * F) % 2) == 0)
{
O = 2;
}
else
{
O = 1 ;
}
T = Math.floor((N - 5 * F - O)/2);
document.write( "Count of 5 valued coins: " + F + "<br>" );
document.write( "Count of 2 valued coins: " + T + "<br>" );
document.write( "Count of 1 valued coins: " + O + "<br>" );
}
var N = 8;
find(N);
</script>
|
Output:
Count of 5 valued coins: 0
Count of 2 valued coins: 3
Count of 1 valued coins: 2
Time Complexity: O(1)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...