#include <iostream>
#include <cstring>
#include <sys/time.h>
#include <limits.h>
using namespace std;
int max2(int a, int b)
{
return (a>b) ? a : b;
}
int max3(int a, int b, int c)
{
if(a>c)
return (a>b) ? a : b;
else
return (c>b) ? c : b;
}
int min3(int a, int b, int c)
{
if(a<c)
return (a<b) ? a : b;
else
return (c<b) ? c : b;
}
int Coins_rec(int * S, int m, int n)
{
if(n == 0)
return 1;
if(n < 0)
return 0;
if(m<=0 && n >=0){
return 0;
}
return ( Coins_rec( S, m-1, n ) + Coins_rec( S, m, n - S[m-1] ) );
}
int memo[101][101] ;
int Coins_memoization(int * S, int m, int n)
{
if(n == 0)
return 1;
if(n < 0)
return 0;
if(m<=0 && n >=0){
return 0;
}
if(memo[m][n] !=-1) {
return memo[m][n];
} else
{
memo[m][n] = ( Coins_memoization( S, m-1, n ) + Coins_memoization( S, m, n - S[m-1] ) );
return memo[m][n];
}
}
int Coins_tabulation (int * S, int m, int n)
{
int L[m+1][n+1] ; //L[i][j] -> Minimum number of 'i' different types of coins required to make final amonut j
int i, j;
L[0][0] = 1;
for(i=0;i<=m;i++){
for(j=0;j<=n;j++){
if (i == 0 && j >= 0) {
L[0][j] = 0;
} else if (i > 0 && j == 0) {
L[i][0] = 1;
} else {
L[i][j] = ( (i >= 1) ? L[i-1][j] : 0 ) + ( (j - S[i-1] >=0) ? L[i][j - S[i-1]] : 0 ) ;
}
}
}
return L[m][n];
} // ----- end of function Coins_tabulation -----
int main() {
int arr[] = {2, 5, 3, 6};
int m = sizeof(arr)/sizeof(arr[0]);
int n;
cout << "Enter the amount" << endl;
cin >> n;
for(int i=0; i<=101; i++){
for(int j=0; j<=101; j++){
memo[i][j] = -1;
}
}
struct timeval t0; gettimeofday(&t0 , NULL);
cout << "Number of Ways = " << Coins_rec(arr, m, n) << endl;
struct timeval t1; gettimeofday(&t1 , NULL);
cout << "-------------- recursion : " << (t1.tv_sec - t0.tv_sec) << " seconds and " << (t1.tv_usec - t0.tv_usec) << " microseconds" << endl;
cout << "Number of Ways (Memoization) = " << Coins_memoization(arr, m, n) << endl;
struct timeval t2; gettimeofday(&t2 , NULL);
cout << "-------------- memoization : " << (t2.tv_sec - t1.tv_sec) << " seconds and " << (t2.tv_usec - t1.tv_usec) << " microseconds" << endl;
cout << "Number of Ways (Tabulation) = " << Coins_tabulation(arr, m, n) << endl;
struct timeval t3; gettimeofday(&t3 , NULL);
cout << "-------------- tabulation : " << (t3.tv_sec - t2.tv_sec) << " seconds and " << (t3.tv_usec - t2.tv_usec) << " microseconds" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWF4MihpbnQgYSwgaW50IGIpCnsKCXJldHVybiAoYT5iKSA/IGEgOiBiOwp9CgppbnQgbWF4MyhpbnQgYSwgaW50IGIsIGludCBjKQp7CglpZihhPmMpCgkJcmV0dXJuIChhPmIpID8gYSA6IGI7CgllbHNlCgkJcmV0dXJuIChjPmIpID8gYyA6IGI7Cn0KCmludCBtaW4zKGludCBhLCBpbnQgYiwgaW50IGMpCnsKCWlmKGE8YykKCQlyZXR1cm4gKGE8YikgPyBhIDogYjsKCWVsc2UKCQlyZXR1cm4gKGM8YikgPyBjIDogYjsKfQoKCmludCBDb2luc19yZWMoaW50ICogUywgaW50IG0sIGludCBuKQp7CglpZihuID09IDApCgkJcmV0dXJuIDE7CgoJaWYobiA8IDApCgkJcmV0dXJuIDA7CgoJaWYobTw9MCAmJiBuID49MCl7CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuICggQ29pbnNfcmVjKCBTLCBtLTEsIG4gKSArIENvaW5zX3JlYyggUywgbSwgbiAtIFNbbS0xXSApICk7Cn0KCgppbnQgbWVtb1sxMDFdWzEwMV0gOwoKCmludCBDb2luc19tZW1vaXphdGlvbihpbnQgKiBTLCBpbnQgbSwgaW50IG4pCnsKCglpZihuID09IDApCgkJcmV0dXJuIDE7CgoJaWYobiA8IDApCgkJcmV0dXJuIDA7CgoJaWYobTw9MCAmJiBuID49MCl7CgkJcmV0dXJuIDA7Cgl9CgoJaWYobWVtb1ttXVtuXSAhPS0xKSB7CgoJCXJldHVybiBtZW1vW21dW25dOwoJfSBlbHNlCgl7CgkJbWVtb1ttXVtuXSA9ICggQ29pbnNfbWVtb2l6YXRpb24oIFMsIG0tMSwgbiApICsgQ29pbnNfbWVtb2l6YXRpb24oIFMsIG0sIG4gLSBTW20tMV0gKSApOwoJCXJldHVybiBtZW1vW21dW25dOwoJfQoKfQoKCmludCBDb2luc190YWJ1bGF0aW9uIChpbnQgKiBTLCBpbnQgbSwgaW50IG4pCnsKCWludCBMW20rMV1bbisxXSA7CS8vTFtpXVtqXSAtPiBNaW5pbXVtIG51bWJlciBvZiAnaScgZGlmZmVyZW50IHR5cGVzIG9mIGNvaW5zIHJlcXVpcmVkIHRvIG1ha2UgZmluYWwgYW1vbnV0IGoKCWludCBpLCBqOwoKCUxbMF1bMF0gPSAxOwoKCWZvcihpPTA7aTw9bTtpKyspewoJCWZvcihqPTA7ajw9bjtqKyspewoJCQlpZiAoaSA9PSAwICYmIGogPj0gMCkgewoJCQkJTFswXVtqXSA9IDA7CgkJCX0gZWxzZSBpZiAoaSA+IDAgJiYgaiA9PSAwKSB7CgkJCQlMW2ldWzBdID0gMTsKCQkJfSBlbHNlIHsKCQkJCUxbaV1bal0gPSAoIChpID49IDEpID8gTFtpLTFdW2pdIDogMCApICsgKCAoaiAtIFNbaS0xXSA+PTApID8gTFtpXVtqIC0gU1tpLTFdXSA6IDAgKSA7CgkJCX0KCQl9Cgl9CglyZXR1cm4gTFttXVtuXTsKfQkJLy8gLS0tLS0gIGVuZCBvZiBmdW5jdGlvbiBDb2luc190YWJ1bGF0aW9uICAtLS0tLSAKCgoKCmludCBtYWluKCkgewoKCWludCBhcnJbXSA9IHsyLCA1LCAzLCA2fTsKCWludCBtID0gc2l6ZW9mKGFycikvc2l6ZW9mKGFyclswXSk7CglpbnQgbjsKCgljb3V0IDw8ICJFbnRlciB0aGUgYW1vdW50IiA8PCBlbmRsOwoJY2luID4+IG47CgoJZm9yKGludCBpPTA7IGk8PTEwMTsgaSsrKXsKCQlmb3IoaW50IGo9MDsgajw9MTAxOyBqKyspewoJCQltZW1vW2ldW2pdID0gLTE7CgkJfQoJfQoKCXN0cnVjdCB0aW1ldmFsIHQwOyBnZXR0aW1lb2ZkYXkoJnQwICwgTlVMTCk7CgoJY291dCA8PCAiTnVtYmVyIG9mIFdheXMgPSAiIDw8IENvaW5zX3JlYyhhcnIsIG0sIG4pIDw8IGVuZGw7CglzdHJ1Y3QgdGltZXZhbCB0MTsgZ2V0dGltZW9mZGF5KCZ0MSAsIE5VTEwpOwoJY291dCA8PCAiLS0tLS0tLS0tLS0tLS0gcmVjdXJzaW9uIDogIiA8PCAodDEudHZfc2VjIC0gdDAudHZfc2VjKSA8PCAiIHNlY29uZHMgYW5kICIgPDwgKHQxLnR2X3VzZWMgLSB0MC50dl91c2VjKSA8PCAiIG1pY3Jvc2Vjb25kcyIgPDwgZW5kbDsKCgljb3V0IDw8ICJOdW1iZXIgb2YgV2F5cyAoTWVtb2l6YXRpb24pID0gIiAgPDwgQ29pbnNfbWVtb2l6YXRpb24oYXJyLCBtLCBuKSA8PCBlbmRsOwoJc3RydWN0IHRpbWV2YWwgdDI7IGdldHRpbWVvZmRheSgmdDIgLCBOVUxMKTsKCWNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tIG1lbW9pemF0aW9uIDogIiA8PCAodDIudHZfc2VjIC0gdDEudHZfc2VjKSA8PCAiIHNlY29uZHMgYW5kICIgPDwgKHQyLnR2X3VzZWMgLSB0MS50dl91c2VjKSA8PCAiIG1pY3Jvc2Vjb25kcyIgPDwgZW5kbDsKCgoJY291dCA8PCAiTnVtYmVyIG9mIFdheXMgKFRhYnVsYXRpb24pID0gIiAgPDwgQ29pbnNfdGFidWxhdGlvbihhcnIsIG0sIG4pIDw8IGVuZGw7CglzdHJ1Y3QgdGltZXZhbCB0MzsgZ2V0dGltZW9mZGF5KCZ0MyAsIE5VTEwpOwoJY291dCA8PCAiLS0tLS0tLS0tLS0tLS0gdGFidWxhdGlvbiA6ICIgPDwgKHQzLnR2X3NlYyAtIHQyLnR2X3NlYykgPDwgIiBzZWNvbmRzIGFuZCAiIDw8ICh0My50dl91c2VjIC0gdDIudHZfdXNlYykgPDwgIiBtaWNyb3NlY29uZHMiIDw8IGVuZGw7CgoJcmV0dXJuIDA7Cgp9