PHP Program for Coin Change | DP-7
Last Updated :
09 Nov, 2023
Write a PHP program for a given integer array of coins[ ] of size N representing different types of denominations and an integer sum, the task is to find the number of ways to make a sum by using different denominations.
Examples:
Input: sum = 4, coins[] = {1,2,3},
Output: 4
Explanation: there are four solutions: {1, 1, 1, 1}, {1, 1, 2}, {2, 2}, {1, 3}.
Input: sum = 10, coins[] = {2, 5, 3, 6}
Output: 5
Explanation: There are five solutions: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} and {5,5}.
PHP Program for Coin Change using Recursion:
Recurrence Relation:
count(coins,n,sum) = count(coins,n,sum-count[n-1]) + count(coins,n-1,sum)
For each coin, there are 2 options.
- Include the current coin: Subtract the current coin’s denomination from the target sum and call the count function recursively with the updated sum and the same set of coins i.e., count(coins, n, sum – coins[n-1] )
- Exclude the current coin: Call the count function recursively with the same sum and the remaining coins. i.e., count(coins, n-1,sum ).
The final result will be the sum of both cases.
Base case:
- If the target sum (sum) is 0, there is only one way to make the sum, which is by not selecting any coin. So, count(0, coins, n) = 1.
- If the target sum (sum) is negative or no coins are left to consider (n == 0), then there are no ways to make the sum, so count(sum, coins, 0) = 0.
- Coin Change | DP-7
Below is the Implementation of the above approach:
PHP
<?php
// Recursive PHP program for
// coin change problem.
// Returns the count of ways we can
// sum coins[0...n-1] coins to get sum "sum"
function coun($coins, $n, $sum)
{
// If sum is 0 then there is
// 1 solution (do not include
// any coin)
if ($sum == 0)
return 1;
// If sum is less than 0 then no
// solution exists
if ($sum < 0)
return 0;
// If there are no coins and sum
// is greater than 0, then no
// solution exist
if ($n <= 0)
return 0;
// count is sum of solutions (i)
// including coins[n-1] (ii) excluding coins[n-1]
return coun($coins, $n - 1,$sum ) +
coun($coins, $n, $sum - $coins[$n - 1] );
}
// Driver Code
$coins = array(1, 2, 3);
$n = count($coins);
echo coun($coins, $n, 5);
// This code is contributed by Sam007
?>
Time Complexity: O(2sum)
Auxiliary Space: O(sum)
PHP Program for Coin Change using Dynamic Programming (Memoization) :
The above recursive solution has Optimal Substructure and Overlapping Subproblems so Dynamic programming (Memoization) can be used to solve the problem. So 2D array can be used to store results of previously solved subproblems.
Step-by-step approach:
- Create a 2D dp array to store the results of previously solved subproblems.
- dp[i][j] will represent the number of distinct ways to make the sum j by using the first i coins.
- During the recursion call, if the same state is called more than once, then we can directly return the answer stored for that state instead of calculating again.
Below is the implementation of the above approach:
PHP
<?php
function countWays($coins, $n, $sum, &$dp) {
// Base Case
if ($sum == 0) {
$dp[$n][$sum] = 1;
return 1;
}
// If the subproblem is previously calculated, return the result
if ($n <= 0 || $sum < 0) {
return 0;
}
if ($dp[$n][$sum] != -1) {
return $dp[$n][$sum];
}
// Two options for the current coin
$dp[$n][$sum] = countWays($coins, $n, $sum - $coins[$n - 1], $dp)
+ countWays($coins, $n - 1, $sum, $dp);
return $dp[$n][$sum];
}
$tc = 1;
// Read input here if needed
while ($tc--) {
$n = 3;
$sum = 5;
$coins = [1, 2, 3];
$dp = array_fill(0, $n + 1, array_fill(0, $sum + 1, -1));
$res = countWays($coins, $n, $sum, $dp);
echo $res . PHP_EOL;
}
?>
Time Complexity: O(N*sum), where N is the number of coins and sum is the target sum.
Auxiliary Space: O(N*sum)
PHP Program for Coin Change using Dynamic Programming (Tabulation):
- Create a 2D dp array with rows and columns equal to the number of coin denominations and target sum.
dp[0][0]
will be set to
1
which represents the base case where the target sum is 0, and there is only one way to make the change by not selecting any coin.- Iterate through the rows of the dp array (i from 1 to
n
), representing the current coin being considered.- The inner loop iterates over the target sums (
j
from 0 to sum
).- Add the number of ways to make change without using the current coin, i.e.,
dp[i][j] += dp[i-1][j]
. - Add the number of ways to make change using the current coin, i.e.,
dp[i][j] += dp[i][j-coins[i-1]]
.
dp[n][sum]
will contain the total number of ways to make change for the given target sum using the available coin denominations.
Below is the implementation of the above approach:
PHP
<?php
function countDistinctWays($coins, $n, $sum) {
$dp = array_fill(0, $sum + 1, 0);
$dp[0] = 1;
for ($i = 0; $i < $n; $i++) {
for ($j = $coins[$i]; $j <= $sum; $j++) {
$dp[$j] += $dp[$j - $coins[$i]];
}
}
return $dp[$sum];
}
$coins = [2, 5, 3, 6];
$n = 4;
$sum = 10;
echo countDistinctWays($coins, $n, $sum) . PHP_EOL;
?>
Time complexity : O(N*sum)
Auxiliary Space : O(N*sum)
PHP Program for Coin Change using the Space Optimized 1D array:
In the above tabulation approach we are only using dp[i-1][j] and dp[i][j] etc, so we can do space optimization by only using a 1d dp array.
Step-by-step approach:
- Create a 1D dp array,
dp[i]
represents the number of ways to make the sum i
using the given coin denominations. - The outer loop iterates over the coins, and the inner loop iterates over the target sums. For each
dp[j]
, it calculates the number of ways to make change using the current coin denomination and the previous results stored in dp
. dp[sum]
contains the total number of ways to make change for the given target sum using the available coin denominations. This approach optimizes space by using a 1D array instead of a 2D DP table.
Below is the implementation of the above approach:
PHP
<?php
function count_1( &$coins, $n, $sum )
{
// table[i] will be storing the number
// of solutions for value i. We need sum+1
// rows as the table is constructed in
// bottom up manner using the base case (sum = 0)
$table = array_fill(0, $sum + 1, NULl);
// Base case (If given value is 0)
$table[0] = 1;
// Pick all coins one by one and update
// the table[] values after the index
// greater than or equal to the value
// of the picked coin
for($i = 0; $i < $n; $i++)
for($j = $coins[$i]; $j <= $sum; $j++)
$table[$j] += $table[$j - $coins[$i]];
return $table[$sum];
}
// Driver Code
$coins = array(2, 5, 3, 6);
$n = sizeof($coins);
$sum = 10;
$x = count_1($coins, $n, $sum);
echo $x;
// This code is contributed
// by ChitraNayal
?>
Time complexity : O(N*sum)
Auxiliary Space : O(sum)
Please refer complete article on Coin Change | DP-7 for more details!
Similar Reads
PHP program to change date format You are given a string which contain date and time. Date in dd/mm/yyyy format and time in 12 hrs format.You have to convert date in yyyy/mm/dd format and time in 24 hrs format. Examples: Input : $date = "12/05/2018 10:12 AM" Output : 2018-05-12 10:12:00 Input : $date = "06/12/2014 04:13 PM" Output :
1 min read
How to do syntax checking using PHP ? Syntax checking is one of the most important tasks in programming. Our compiler checks our code and shows relevant errors if there is any in the code i.e. compile time, run time, syntax, etc. We can do the same thing i.e. syntax checking in PHP. In this article, we are going to learn how we can do s
2 min read
Write a program to display Reverse of any number in PHP ? Write a program to reverse the digits of an integer. Examples : Input : num = 12345 Output: 54321 Input : num = 876 Output: 678 It can be achieved using Iterative way or Recursive Way Iterative Method: Algorithm: Input: num (1) Initialize rev_num = 0 (2) Loop while num > 0 (a) Multiply rev_num by
2 min read
PHP program to swap two numbers Integer values can be stored in a variable in PHP. It is easy to store and modify and swap these integer values using various mentioned approaches: Using a temporary variable: The value of the first number is stored in the temporary variable. This value is then replaced by the value of the second nu
4 min read
Program to print multiplication table of any number in PHP In this article, we will see how to print the multiplication table of any given number using PHP. To make the multiplication table, first, we get a number input from the user and then use for loop to display the multiplication table. We use HTML and PHP to display the multiplication table. The HTML
1 min read
How to Convert a Given Number to Words in PHP? Given an integer N, your task is to convert the given number into words using PHP.Examples:Input: N = 958237764Output: Nine Hundred Fifty Eight Million Two Hundred Thirty Seven Thousand Seven Hundred Sixty FourInput: N = 5000Output: Five ThousandBelow are the approaches to convert a given number to
5 min read
PHP | Palindrome Check In this article, we will learn how to check whether a number and a string is a palindrome or not in PHP. A number or string is said to be a palindrome if it remains same even after reversing the digits or letters respectively.Examples for Palindrome Number: Input : 1441 Output : Palindrome Explanati
3 min read
PHP 7 | Spaceship Operator This article will make you aware of a very useful operator i.e the spaceship operator PHP 7. The spaceship operator or combined comparison operator is denoted by "". This is a three-way comparison operator and it can perform greater than, less than and equal comparison between two operands. This ope
2 min read
PHP | Converting string to Date and DateTime Converting the string to Date and DateTime uses several functions/methods like strtotime(), getDate(). We will see what these functions do. strtotime() This is basically a function which returns the number of seconds passed since Jan 1, 1970, just like a linux machine timestamp. It returns the numbe
2 min read
PHP Program to Print ASCII Value of all Digits of a Given Number Given a number, the task is to print ASCII value of all digits of a given number in PHP. ASCII values are often used to represent characters and digits. Sometimes, it's necessary to find the ASCII value of each digit in a given number, especially when dealing with character encoding or data manipula
3 min read