using System;
public class Test
{
public static void Main( )
{
//http://w...content-available-to-author-only...s.org/dynamic-programming-set-7-coin-change/#comment-2739406149
//http://a...content-available-to-author-only...n.com/dynamic-programming-coin-change-problem/
//http://w...content-available-to-author-only...t.com/index.php/Coin_Change
var coins = new int [ ] { 3 , 2 , 1 } ;
var changeRequiredForAmount = 5 ;
Console.WriteLine ( "Find Different Ways to provide change:" ) ;
Console.WriteLine ( "Amount: {0} using unlimited supply of denominations of [{1}]" , changeRequiredForAmount, string.Join ( " , " , coins) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "Total number of ways (Recursion): {0}" , FindDifferentWaysToProvideChange( coins, coins.Length , changeRequiredForAmount) ) ;
Console.WriteLine ( ) ;
Console.WriteLine ( "TOtal number of ways using DP: {0}" , FindDifferentWaysToProvideChangeDP( coins, changeRequiredForAmount) ) ;
}
private static int FindDifferentWaysToProvideChange( int [ ] coins, int totalDenomination, int changeForAmount)
{
//Console.WriteLine("Total Denomination: {0}, changeForAmount: {1}",totalDenomination,changeForAmount);
if ( changeForAmount == 0 )
return 1 ;
if ( changeForAmount < 0 )
return 0 ;
if ( totalDenomination <= 0 && changeForAmount >= 1 )
return 0 ;
return FindDifferentWaysToProvideChange( coins, totalDenomination- 1 , changeForAmount) +
FindDifferentWaysToProvideChange( coins, totalDenomination, changeForAmount- coins[ totalDenomination- 1 ] ) ;
}
private static int FindDifferentWaysToProvideChangeDP( int [ ] coins, int changeForAmount)
{
var totalDenominationTypes = coins.Length ;
var amount = changeForAmount;
var solutionMatrix = new int [ totalDenominationTypes+ 1 , amount+ 1 ] ;
for ( int i= 0 ; i<= totalDenominationTypes; i++ )
solutionMatrix[ i, 0 ] = 1 ;
for ( int j= 0 ; j<= amount; j++ )
solutionMatrix[ 0 , j] = 0 ;
for ( int i= 1 ; i<= totalDenominationTypes; i++ )
{
for ( int j= 1 ; j<= amount; j++ )
{
if ( coins[ i- 1 ] <= j)
{
solutionMatrix[ i, j] = solutionMatrix[ i - 1 , j] + solutionMatrix[ i, j - coins[ i - 1 ] ] ;
}
else
solutionMatrix[ i, j] = solutionMatrix[ i - 1 , j] ;
}
}
Console.WriteLine ( "********************* DP SolutionMatrix: ********************" ) ;
for ( int i= 0 ; i<= totalDenominationTypes; i++ )
{
for ( int j= 0 ; j<= amount; j++ )
{
Console.Write ( " {0} " , solutionMatrix[ i, j] ) ;
}
Console.WriteLine ( ) ;
}
Console.WriteLine ( ) ;
return solutionMatrix[ totalDenominationTypes, amount] ;
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCS8vaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMub3JnL2R5bmFtaWMtcHJvZ3JhbW1pbmctc2V0LTctY29pbi1jaGFuZ2UvI2NvbW1lbnQtMjczOTQwNjE0OQoJCS8vaHR0cDovL2EuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm4uY29tL2R5bmFtaWMtcHJvZ3JhbW1pbmctY29pbi1jaGFuZ2UtcHJvYmxlbS8KCQkvL2h0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50LmNvbS9pbmRleC5waHAvQ29pbl9DaGFuZ2UKCQl2YXIgY29pbnMgPSBuZXcgaW50W117MywyLDF9OwoJCXZhciBjaGFuZ2VSZXF1aXJlZEZvckFtb3VudCA9IDU7CgkJQ29uc29sZS5Xcml0ZUxpbmUoIkZpbmQgRGlmZmVyZW50IFdheXMgdG8gcHJvdmlkZSBjaGFuZ2U6Iik7CgkJQ29uc29sZS5Xcml0ZUxpbmUoIkFtb3VudDogezB9IHVzaW5nIHVubGltaXRlZCBzdXBwbHkgb2YgZGVub21pbmF0aW9ucyBvZiBbezF9XSIsY2hhbmdlUmVxdWlyZWRGb3JBbW91bnQsIHN0cmluZy5Kb2luKCIgLCAiLGNvaW5zKSk7CgkJCgkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQlDb25zb2xlLldyaXRlTGluZSgiVG90YWwgbnVtYmVyIG9mIHdheXMgKFJlY3Vyc2lvbik6IHswfSIsRmluZERpZmZlcmVudFdheXNUb1Byb3ZpZGVDaGFuZ2UoY29pbnMsY29pbnMuTGVuZ3RoLGNoYW5nZVJlcXVpcmVkRm9yQW1vdW50KSk7CgkJCgkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKCQlDb25zb2xlLldyaXRlTGluZSgiVE90YWwgbnVtYmVyIG9mIHdheXMgdXNpbmcgRFA6IHswfSIsRmluZERpZmZlcmVudFdheXNUb1Byb3ZpZGVDaGFuZ2VEUChjb2lucyxjaGFuZ2VSZXF1aXJlZEZvckFtb3VudCkpOwoJfQoJCglwcml2YXRlIHN0YXRpYyBpbnQgRmluZERpZmZlcmVudFdheXNUb1Byb3ZpZGVDaGFuZ2UoaW50W10gY29pbnMsaW50IHRvdGFsRGVub21pbmF0aW9uLCBpbnQgY2hhbmdlRm9yQW1vdW50KQoJewoJCS8vQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIERlbm9taW5hdGlvbjogezB9LCBjaGFuZ2VGb3JBbW91bnQ6IHsxfSIsdG90YWxEZW5vbWluYXRpb24sY2hhbmdlRm9yQW1vdW50KTsKCQlpZihjaGFuZ2VGb3JBbW91bnQgPT0gMCkKCQkJcmV0dXJuIDE7CgkJCQoJCWlmKGNoYW5nZUZvckFtb3VudCA8IDApCgkJCXJldHVybiAwOwoJCQkKCQlpZih0b3RhbERlbm9taW5hdGlvbiA8PSAwICYmIGNoYW5nZUZvckFtb3VudCA+PSAxKQoJCQlyZXR1cm4gMDsKCQkJCgkJcmV0dXJuIEZpbmREaWZmZXJlbnRXYXlzVG9Qcm92aWRlQ2hhbmdlKGNvaW5zLCB0b3RhbERlbm9taW5hdGlvbi0xLGNoYW5nZUZvckFtb3VudCkgKwoJCQlGaW5kRGlmZmVyZW50V2F5c1RvUHJvdmlkZUNoYW5nZShjb2lucywgdG90YWxEZW5vbWluYXRpb24sY2hhbmdlRm9yQW1vdW50LWNvaW5zW3RvdGFsRGVub21pbmF0aW9uLTFdKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgaW50IEZpbmREaWZmZXJlbnRXYXlzVG9Qcm92aWRlQ2hhbmdlRFAoaW50W10gY29pbnMsaW50IGNoYW5nZUZvckFtb3VudCkKCXsKCQl2YXIgdG90YWxEZW5vbWluYXRpb25UeXBlcyA9IGNvaW5zLkxlbmd0aDsKCQl2YXIgYW1vdW50ID0gY2hhbmdlRm9yQW1vdW50OwoJCXZhciBzb2x1dGlvbk1hdHJpeCA9IG5ldyBpbnRbdG90YWxEZW5vbWluYXRpb25UeXBlcysxLGFtb3VudCsxXTsKCQkKCQlmb3IoaW50IGk9MDtpPD10b3RhbERlbm9taW5hdGlvblR5cGVzO2krKykKCQkJc29sdXRpb25NYXRyaXhbaSwwXSA9IDE7CgkJCQoJCWZvcihpbnQgaj0wO2o8PWFtb3VudDtqKyspCgkJCXNvbHV0aW9uTWF0cml4WzAsal0gPSAwOwoJCQkKCQlmb3IoaW50IGk9MTtpPD10b3RhbERlbm9taW5hdGlvblR5cGVzO2krKykKCQl7CgkJCWZvcihpbnQgaj0xO2o8PWFtb3VudDtqKyspCgkJCXsKCQkJCWlmKGNvaW5zW2ktMV0gPD0gaikKCQkJCXsKCQkJCQlzb2x1dGlvbk1hdHJpeFtpLGpdID0gc29sdXRpb25NYXRyaXhbaSAtIDEsal0gKyBzb2x1dGlvbk1hdHJpeFtpLGogLSBjb2luc1tpIC0gMV1dOwoJCQkJfQoJCQkJZWxzZQoJCQkJCXNvbHV0aW9uTWF0cml4W2ksal0gPSBzb2x1dGlvbk1hdHJpeFtpIC0gMSxqXTsKCQkJfQoJCX0KCQlDb25zb2xlLldyaXRlTGluZSgiKioqKioqKioqKioqKioqKioqKioqIERQIFNvbHV0aW9uTWF0cml4OiAqKioqKioqKioqKioqKioqKioqKiIpOwoJCWZvcihpbnQgaT0wO2k8PXRvdGFsRGVub21pbmF0aW9uVHlwZXM7aSsrKQoJCXsKCQkJZm9yKGludCBqPTA7ajw9YW1vdW50O2orKykKCQkJewoJCQkJQ29uc29sZS5Xcml0ZSgiIHswfSAiLHNvbHV0aW9uTWF0cml4W2ksal0pOwoJCQl9CgkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJfQoJCUNvbnNvbGUuV3JpdGVMaW5lKCk7CgkJCgkJcmV0dXJuIHNvbHV0aW9uTWF0cml4W3RvdGFsRGVub21pbmF0aW9uVHlwZXMsYW1vdW50XTsKCX0KfQ==