You have an unlimited amount of banknotes worth A and B dollars (A not equals to B). You want to pay a total of S dollars using exactly N notes. The task is to find the number of notes worth A dollars you need. If there is no solution return -1.
Examples:
Input: A = 1, B = 2, S = 7, N = 5
Output: 3
3 * A + 2 * B = S
3 * 1 + 2 * 2 = 7Input: A = 2, B = 1, S = 7, N = 5
Output: 2Input: A = 2, B = 1, S = 4, N = 5
Output: -1Input: A = 2, B = 3, S = 20, N = 8
Output: 4
Approach: Let x be the number of notes of value A required then the rest of the notes i.e. N - x must of value B. Since, their sum is required be S then the following equation must be satisfied:
S = (A * x) + (B * (N - x))
Solving the equation further,
S = (A * x) + (B * N) - (B * x)
S - (B * N) = (A - B) * x
x = (S - (B * N)) / (A - B)
After solving for x, it is the number of notes of value A required
only if the value of x is an integer else the result is not possible.
Below is the implementation of the above approach:
// C++ implementation of the approach
#include<bits/stdc++.h>
using namespace std;
// Function to return the amount of notes
// with value A required
int bankNotes(int A, int B, int S, int N)
{
int numerator = S - (B * N);
int denominator = A - B;
// If possible
if (numerator % denominator == 0)
return (numerator / denominator);
return -1;
}
// Driver code
int main()
{
int A = 1, B = 2, S = 7, N = 5;
cout << bankNotes(A, B, S, N) << endl;
}
// This code is contributed by mits
// Java implementation of the approach
class GFG {
// Function to return the amount of notes
// with value A required
static int bankNotes(int A, int B, int S, int N)
{
int numerator = S - (B * N);
int denominator = A - B;
// If possible
if (numerator % denominator == 0)
return (numerator / denominator);
return -1;
}
// Driver code
public static void main(String[] args)
{
int A = 1, B = 2, S = 7, N = 5;
System.out.print(bankNotes(A, B, S, N));
}
}
# Python3 implementation of the approach
# Function to return the amount of notes
# with value A required
def bankNotes(A, B, S, N):
numerator = S - (B * N)
denominator = A - B
# If possible
if (numerator % denominator == 0):
return (numerator // denominator)
return -1
# Driver code
A, B, S, N = 1, 2, 7, 5
print(bankNotes(A, B, S, N))
# This code is contributed
# by mohit kumar
// C# implementation of the approach
using System;
class GFG
{
// Function to return the amount of notes
// with value A required
static int bankNotes(int A, int B,
int S, int N)
{
int numerator = S - (B * N);
int denominator = A - B;
// If possible
if (numerator % denominator == 0)
return (numerator / denominator);
return -1;
}
// Driver code
public static void Main()
{
int A = 1, B = 2, S = 7, N = 5;
Console.Write(bankNotes(A, B, S, N));
}
}
// This code is contributed by Akanksha Rai
<?php
// PHP implementation of the approach
// Function to return the amount of notes
// with value A required
function bankNotes($A, $B, $S, $N)
{
$numerator = $S - ($B * $N);
$denominator = $A - $B;
// If possible
if ($numerator % $denominator == 0)
return ($numerator / $denominator);
return -1;
}
// Driver code
$A = 1; $B= 2; $S = 7; $N = 5;
echo(bankNotes($A, $B, $S, $N));
// This code is contributed by Code_Mech
?>
<script>
// Javascript implementation of the approach
// Function to return the amount of notes
// with value A required
function bankNotes(A, B, S, N)
{
let numerator = S - (B * N);
let denominator = A - B;
// If possible
if (numerator % denominator == 0)
return (Math.floor(numerator /
denominator));
return -1;
}
// Driver Code
let A = 1, B = 2, S = 7, N = 5;
document.write(bankNotes(A, B, S, N) + "</br>");
// This code is contributed by jana_sayantan
</script>
Output:
3
Time Complexity: O(1)
Auxiliary Space: O(1)