Advertisement
shamiul93

LightOJ 1231 - Coin Change(1) TLE. 3 state DP.

Mar 10th, 2017
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - 1231 - Coin Change (I)
  4.  
  5. Concept -
  6.  
  7.     DP. Coin Change.
  8.  
  9.     ** I solved this with only recursion. It can also be solved by using for loop.But I couldn't understand that
  10.     solution till now. May be someday I will.
  11.     ** It consumes more memory. And not efficient. Gets TLE. -_-
  12.     ** It's my first problem on Limited coin change.
  13.  
  14. */
  15.  
  16. #include<bits/stdc++.h>
  17. #define ll long long
  18. #define fo freopen("out.txt","w",stdout)
  19. #define fi freopen("in.txt","r",stdin)
  20. #define DEBUG printf("hi\n");
  21. #define DEBUG2 printf("bi\n");
  22. #define pi acos(-1)
  23. #define m 100000007
  24. #define d 0.000000001
  25.  
  26. using namespace std ;
  27.  
  28. ll N, K ;
  29. ll CoinValue[100] ;
  30. ll AtMost[100] ;
  31. int dp[51][1001][21] ;
  32.  
  33. void reset()
  34. {
  35.     memset(dp, -1, sizeof(dp));
  36. }
  37.  
  38. int rec(ll i, ll n, ll t)   /// i == index , n == requirement theke komte komte koto hoise...
  39. {
  40.     if( t > AtMost[i])
  41.     {
  42.         return 0 ;
  43.     }
  44.  
  45.     if (n == 0)
  46.         return 1;
  47.  
  48.     if (n < 0)
  49.         return 0;
  50.  
  51.     if(i >= N && n > 0)
  52.     {
  53.         return 0 ;
  54.     }
  55.  
  56.  
  57.     if(dp[i][n][t] != -1)
  58.         return dp[i][n][t] ;
  59.  
  60.     return dp[i][n][t] = ((rec( i, n - CoinValue[i], t+1 ) % m  + rec( i+1, n, 0 )  ) % m ) % m  ;
  61.  
  62. }
  63.  
  64. int main()
  65. {
  66. //    fi ;
  67. //    fo ;
  68.  
  69.     ll T, t = 0 ;
  70.     scanf("%lld",&T);
  71.     while(T--)
  72.     {
  73.  
  74.         reset();
  75.         t++ ;
  76.  
  77.         scanf("%lld %lld",&N, &K);
  78.  
  79.         for(ll i = 0 ; i< N ; i++)
  80.         {
  81.             scanf("%lld",&CoinValue[i]) ;
  82.         }
  83.         for(ll i = 0 ; i < N ; i++)
  84.         {
  85.             scanf("%lld", &AtMost[i]) ;
  86.         }
  87.  
  88.         ll ans ;
  89.         ans = rec(0, K, 0) ;
  90.  
  91.         printf("Case %lld: %lld\n",t, ans) ;
  92.     }
  93.  
  94.     return 0 ;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement