Advertisement
shamiul93

LightOJ 1231 - Coin Change(1)

Mar 11th, 2017
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 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 recursion + loop.
  10.     ** It consumes less memory. And very efficient.
  11.     ** It's my first problem on Limited coin change.
  12.  
  13.     # Here we are running the recursion till Atmost[i] times. This helps us to find
  14.     out how many ways we can make the target amount.
  15.     # We use  -  rec( i+1 , n-coinValue[i]*k )
  16.     # Look , when the value of k is '0' , then it becomes rec( i+1 , n ) - remember something?
  17.     # Yes. When we don't take i th element , and take the i+1 th element.
  18.     # But if we take the i th one, then to take i+1 th , the n will be reduced.
  19.     # So , now we can get the result by recursion.
  20.     # it takes less memory than 3 state dp.
  21. */
  22.  
  23. #include<bits/stdc++.h>
  24. #define ll long long
  25. #define fo freopen("out.txt","w",stdout)
  26. #define fi freopen("in.txt","r",stdin)
  27. #define DEBUG printf("hi\n");
  28. #define DEBUG2 printf("bi\n");
  29. #define pi acos(-1)
  30. #define m 100000007
  31. #define d 0.000000001
  32.  
  33. using namespace std ;
  34.  
  35. ll N, K ;
  36. ll CoinValue[100] ;
  37. ll AtMost[100] ;
  38. int dp[51][1011] ;
  39.  
  40.  
  41. int rec(ll i, ll n)   /// i == index , n == requirement theke komte komte koto hoise...
  42. {
  43.  
  44.     if (n == 0)
  45.         return 1;
  46.  
  47.     if (n < 0)
  48.         return 0;
  49.  
  50.     if(i >= N && n > 0)
  51.     {
  52.         return 0 ;
  53.     }
  54.  
  55.  
  56.     if(dp[i][n] != -1)
  57.         return dp[i][n] ;
  58.  
  59.     int res = 0 ;
  60.     for(ll k = 0; k <= AtMost[i] ; k++)
  61.     {
  62.         res = (res %m + rec(i+1 , n - CoinValue[i]*k) % m) % m  ;
  63.     }
  64.    
  65.     /* অনেক সময়ই মনে হতো , কয়েন চেঞ্জে তো আমরা ২ টা ভ্যালু বের করতাম , এই কয়েন নিলে কি হবে , না নিলে কি হবে , এরপর এদের ম্যাক্স বের করতাম । এখানে এটা করি নাই কেন ? এই চিন্তা অনেক দিন করসি । পরে বুঝলাম আসলে ফরলুপ এই কাজ করে দেয় অটোমেটিক্যালি । কিভাবে ?
  66.  
  67. যখন ফর লুপে আমরা k এর ভ্যালু সিলেক্ট করতেসি , এর মানে হলো , k টা কয়েন আমি খোদার কসম আগে নিয়া নিসি । এরপর আর একটাও নিবো না । এজন্য পরের ইন্ডেক্সে পাঠায় দিবো । এভাবে যদি প্রতি ধাপে আগে k টা কয়েন নিয়া পরের ধাপে সেন্ড করি , সব কন্ডিশন চেক হয়েই যাবে ।
  68.  
  69. আরেকটা কথা , amount - coin[i] এই জিনিস টা চেক করি না আমরা । এটা রিটারনে হ্যান্ডেল করে দেই বেইস কেস গুলাতে । <3
  70.     */
  71.    
  72.  
  73.  
  74.     dp[i][n] = res ;
  75.     return dp[i][n] ;
  76.  
  77. }
  78.  
  79. int main()
  80. {
  81.     //fi ;
  82.     //fo ;
  83.  
  84.     ll T, t = 0 ;
  85.     scanf("%lld",&T);
  86.     while(T--)
  87.     {
  88.  
  89.         memset(dp, -1, sizeof(dp));
  90.         t++ ;
  91.  
  92.         scanf("%lld %lld",&N, &K);
  93.  
  94.         for(ll i = 0 ; i< N ; i++)
  95.         {
  96.             scanf("%lld",&CoinValue[i]) ;
  97.         }
  98.         for(ll i = 0 ; i < N ; i++)
  99.         {
  100.             scanf("%lld", &AtMost[i]) ;
  101.         }
  102.  
  103.         ll ans ;
  104.         ans = rec(0, K) ;
  105.  
  106.         printf("Case %lld: %lld\n",t, ans) ;
  107.     }
  108.  
  109.     return 0 ;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement