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
PHP Program to Count set bits in an integer
Write an efficient program to count number of 1s in binary representation of an integer. Examples : Input : n = 6 Output : 2 Binary representation of 6 is 110 and has 2 set bits Input : n = 13 Output : 3 Binary representation of 11 is 1101 and has 3 set bits Recommended: Please solve it on âPRACTICE
2 min read
Output of PHP programs | Set 3
Predict the output of below PHP programs: Question 1 PHP <?php $number = array(0, 1, one, two, three, 5); $num = preg_grep("/[0-5]/", $number); print_r($num); ?> Options: Array([0]=>0 [1]=>1 [2]=>one [3]=>two [4]=>three [5]=>5) Array([2]=>one [3]=>two [4]=>
3 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
How to run PHP programs ?
PHP (Hypertext Preprocessor) is a popular server-side scripting language primarily used for web development. It is designed to generate dynamic web pages and interact with databases. Running PHP programs involves setting up a development environment, whether locally or on a live server. In this arti
2 min read
PHP | gmp_random_bits() Function
The gmp_random_bits() function is an inbuilt function in PHP which generates a random number. The random number will thus be between the range 0 and (2 * bits) - 1. Here bits must be greater than 0, and the maximum value of bits is restricted by available memory. Here GMP refers (GNU Multiple Precis
2 min read
How to convert a String into Number in PHP ?
Strings in PHP can be converted to numbers (float/ int/ double) very easily. In most use cases, it won't be required since PHP does implicit type conversion. This article covers all the different approaches for converting a string into a number in PHP, along with their basic illustrations.There are
4 min read
PHP | preg_replace() Function
The preg_replace() function is an inbuilt function in PHP that is used to perform a regular expression for search and replace the content. Syntax: preg_replace( $pattern, $replacement, $subject, $limit, $count ) Parameters: This function accepts five parameters as mentioned above and described below
2 min read
PHP | IntlChar::charAge() Function
The IntlChar::charAge() function is an inbuilt function in PHP which is used to calculate the age of code point. Where the age is Unicode version when the code point was first designated or assigned a character. This can be useful to avoid emitting code points to receiving processes that do not acce
2 min read
How to Become a PHP Developer
PHP is one of the widely used open-source scripting languages which is specially used for website development and this language can also be embedded into HTML. In this, the server executes the PHP code, and after that, the customer receives the generated HTML. To become a successful PHP Developer, t
8 min read