DP 20. Minimum Coins | DP on Subsequences | Infinite Supplies Pattern

Поделиться
HTML-код
  • Опубликовано: 9 фев 2022
  • Lecture Notes/C++/Java Codes: takeuforward.org/dynamic-prog...
    Problem Link: bit.ly/3HJTeIl
    Pre-req for this Series: • Re 1. Introduction to ...
    a
    Make sure to join our telegram group for discussions: linktr.ee/takeUforward
    Full Playlist: • Striver's Dynamic Prog...
    In this video, we solve the problem of minimum coins. We start with memoization, then tabulation, then two-row space optimization. This problem is the seventh problem on DP on Subsequences Pattern. Please watch DP 14 before watching this.
    If you have not yet checked our SDE sheet, you should definitely do it: takeuforward.org/interviews/s...
    You can also get in touch with me at my social handles: linktr.ee/takeUforward

Комментарии • 683

  • @udaypratapsingh8923
    @udaypratapsingh8923 Год назад +231

    *that 34 minutes is way more precious than my whole college day*

  • @boyidapumohit4715
    @boyidapumohit4715 2 года назад +51

    This series isn't just explaining DP. It's more than that. Initially, for every problem, I used to tabulate and spend lots of time thinking about states, and transitions. But while following these Lecs, I got to know a path to achieve the solution, Now even in interviews, this helps me as I could explain recursive approach to the interviewer, which is very intuitive. Thankyou Striver.

    • @GajendraSingh-lv3jw
      @GajendraSingh-lv3jw Год назад

      bro can we use knapsack approach to reduce the space complexity more?

    • @inclinedscorpio
      @inclinedscorpio Год назад +7

      @@GajendraSingh-lv3jw or kitni reduce karega guru 😂

    • @krishnans1665
      @krishnans1665 Год назад

      @@GajendraSingh-lv3jw
      public int coinChange(int[] coins, int amount) {
      int dp[] = new int[amount + 1];
      Arrays.fill(dp, amount + 1);
      dp[0] = 0;
      for(int coin : coins)
      {
      for(int j = coin; j amount ? - 1 : dp[amount];
      }

    • @sagartaak4017
      @sagartaak4017 Год назад

      ya bro we cant directly dive to tabulation but once we write recursion then it is so easy

  • @arnabdutta4662
    @arnabdutta4662 2 года назад +54

    one more base case can be added -
    if( target == 0 ) return 0; -> in the memoization
    for tabulation -> we can simply start the 2nd loop from 1 to target
    no need to fil for zero as by default its value will be stored as zero.
    Hope it helps :)

    • @subhashpabbineedi7136
      @subhashpabbineedi7136 Год назад

      if you dont mind, can you send the code for tabulation

    • @himanshu6665
      @himanshu6665 Год назад +1

      @@subhashpabbineedi7136 it is not mandatory to add this base case

    • @devanshprakash8354
      @devanshprakash8354 Год назад

      ​​@@subhashpabbineedi7136 fick tabulation only memoization

    • @varunaggarwal7126
      @varunaggarwal7126 Год назад +2

      the if condition will take care of this in recursion and memoization

    • @jitendrakumar-vv8ho
      @jitendrakumar-vv8ho 12 дней назад

      Actually i was wondering why t=0 case has not been taken care of

  • @CEOplays
    @CEOplays 2 года назад +10

    We can solve it using only one array :
    vectorprev(x+1,0);
    for(int i=0;i

  • @deepanshudhakate9622
    @deepanshudhakate9622 2 года назад +67

    Now this DP SERIES is going as per expectations.
    As always
    UNDERSTOOD 🔥 😊

  • @divyambhutani6229
    @divyambhutani6229 2 года назад +30

    Thank you bro . Felt very good , was able to attempt a dp question in one of the contest today . I am happy to witness my growth by watching your dp playlist . thanks very much 🙇

  • @user-zm9qn2sp3h
    @user-zm9qn2sp3h 8 месяцев назад +7

    Facing DP problems: No fear... Striver is here...🤩 thankyou bro.

  • @vivekxdhiman
    @vivekxdhiman Год назад +3

    Understood!! This DP series is magical! 💫🧿

  • @vikrambabariya5166
    @vikrambabariya5166 2 года назад +1

    Totally understood the concept, you made it easy for us! Thanks for all your efforts.

  • @user-ie8sy7wo4m
    @user-ie8sy7wo4m Год назад +4

    Interesting Fact 🌟
    So DP helps to find minimum no. of change notes/coin 💵 I get when I go for shopping. But we don't see a shopkeeper applying DP just to return the change. How does it happen that the shopkeeper always returns the minimum no. of notes 💵as change?
    If you observe they apply greedy approach. But how does greedy give correct answer? Its because our currency denominations (Rs 10, Rs 20, Rs 50, Rs 100.....so on)💵 are such that the greedy approach always gives the optimal answer. Quite Interesting 💡

  • @suyashjain3223
    @suyashjain3223 8 месяцев назад +1

    Getting better at DP day by day Thankyou Striver!!!

  • @akr1831
    @akr1831 2 года назад +31

    There is no any Substitute of Your content on RUclips.
    U r great ❤️

  • @user-nk1rc1fb7d
    @user-nk1rc1fb7d Год назад +3

    Thank you for existing striver ! Helping others is the best thing any human can ever do! U are the best of our kind.

  • @vikasgupta6701
    @vikasgupta6701 Год назад

    Thanks for explaining with so much clarity. Able to do all recursion, memoization, tabulation and finally space optimization :)

  • @stith_pragya
    @stith_pragya 6 месяцев назад +1

    UNDERSTOOD.............Thank You So Much Striver Bhaiya for this wonderful video.........🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

  • @gaura-krishna
    @gaura-krishna Год назад +3

    One of the best decisions that I've made to learn programming is this... Watching your videos Striver...! One day maybe I'll make even better videos...

  • @ThatNibbah
    @ThatNibbah Месяц назад

    Understood to the Highest Level !!!!!!! Thank You Sir.

  • @ScienceSeekho
    @ScienceSeekho Год назад +1

    Thanks Striver

  • @cinime
    @cinime 2 года назад

    Understood! Thank you for your detailed explanation as always !!

  • @ankishkhandelwal1061
    @ankishkhandelwal1061 2 года назад +2

    done this before 3 month after 3 month i Tried this question and boom got this easily u teach very well 👊👊

  • @a_maxed_out_handle_of_30_chars
    @a_maxed_out_handle_of_30_chars 8 месяцев назад +2

    this felt good to watch, thank you :)

  • @kazuma0803
    @kazuma0803 2 года назад

    Thanks a lot Striver, another question I was able to solve without seeing video just because of your old videos

  • @sumerrawat6947
    @sumerrawat6947 Год назад +3

    I love watching these 30 min videos that spend 40 minutes making notes !

  • @johncenakiwi
    @johncenakiwi 2 года назад +12

    Time complexity can be explained like this. O(2^Max(n, amount/min(coins))
    e.g [1,2,3,4] , amount = 12. amount/min(coins) = 12/1 = 12, n=4, Max of the 2=> 12. Therefore O(2^12)
    Please correct me if I am wrong.

    • @himanshuagrawal8012
      @himanshuagrawal8012 2 года назад

      yes its correct, but we can say its exponential in nature

    • @amanydv2112
      @amanydv2112 Год назад

      but here for index=0 the function would directly return target%arr[0]. for other index it complexity should be what you mentioned

  • @katamsreeja6744
    @katamsreeja6744 Год назад

    Understood it clearly. Thank you so much.

  • @PIYUSH61004
    @PIYUSH61004 2 года назад

    Understood man! Amazing work! Keep up the good work

  • @varadthokal1406
    @varadthokal1406 Год назад +1

    Last stage optimisation to use single array:
    class Solution {
    public:
    int MX = 1e5;
    int coinChange(vector& coins, int amount) {
    if (amount == 0)
    return 0;

    vectordpo(amount+1,0); // change vector dimension: use single array. Reason: No need to maintain 2d array. Use in line replace to basically
    // access same information.

    for(int i = 0; i

  • @kunalsaha9239
    @kunalsaha9239 2 года назад

    Clean and clear explanation ☺️☺️.
    Understood 👍🏼👍🏼

  • @rahatsshowcase8614
    @rahatsshowcase8614 2 года назад +3

    similar to combination sum in your recursion playlist so this was easy for me !Us

  • @johncenakiwi
    @johncenakiwi 2 года назад +1

    Thank you!!! Was waiting for this eagerly.

  • @uttejdunga9795
    @uttejdunga9795 Месяц назад +1

    1D optimisation is great , loved it 👍

  • @narolavarshil6067
    @narolavarshil6067 Год назад

    Here we can avoid that modulo calculation and just have N row where with amount 0 mark as 0 else INF..and also in 1d dp it can be reduced to one current only instead of prev and current..so this are some optimization that can be done but you're great teacher anyways..kudos to you for giving back to community

  • @sumeetchawla3545
    @sumeetchawla3545 2 года назад

    Understood and really thankful for your great efforts.

  • @ranasauravsingh
    @ranasauravsingh 2 года назад +1

    UNDERSTOOD... !
    Thanks striver for the video... :)

  • @davidmwangi4312
    @davidmwangi4312 8 месяцев назад

    Most tutorials teaches how to memorise the formulae to solve DP questions but with Striver you get to understand the how thing and you can solve any problem even one that you have never encountered before.

  • @kumarakash5219
    @kumarakash5219 2 года назад

    I solved first dp question by myself ..ty striver ❤️❤️❤️❤️

  • @DevashishJose
    @DevashishJose 6 месяцев назад

    Understood Thank you so much.

  • @adebisisheriff159
    @adebisisheriff159 6 месяцев назад

    Thanks soooooooooooooo much Striver!

  • @jaishriharivishnu
    @jaishriharivishnu 2 дня назад

    3:53 greedy doesn't work because, let suppose x is a number greater than ith coin... now it is not guaranteed that if we make x using coins index < ith coin , we will be encountering the value of ith coin while approaching the x... Denomination like 1,2,5,10,20,50,100.... follow this, let suppose we want to make 59... let suppose we didn't choose 50 rupee...now if you try to make 59 using coin

  • @hrushikesh-1914
    @hrushikesh-1914 9 месяцев назад

    Understood. Thankyou sir

  • @samyakjain7422
    @samyakjain7422 2 года назад

    understood...u r messiah in human form...best dsa content on youTube for sure.

  • @user-ie8sy7wo4m
    @user-ie8sy7wo4m Год назад +6

    Quick Tip 💡 : We can space optimise it using a single array like previous question. Also, we don't have to start inner loop from back this time.

    • @muditkhanna8164
      @muditkhanna8164 9 месяцев назад

      Insightful.
      also i mention that not only that reduces SC but TC also , because inside the first loop we don't have to copy the prev as curr which is 0(n) extra in multiplication. the Tc reduced to approx : (target+1)*(n) from (target+1+n)*(n).
      the reason because of this is when we are in same level we are independent of previous array values, as they could be used but we are checking the same coin if it can fit in again. so ind-1 is not necessary and when we not take there is no need to push any value in curr thus not needing it.

    • @dsp-io9cj
      @dsp-io9cj 9 месяцев назад

      yes, but why shd we go from left to right, im getting wrong ans if j frm sum to 0. I still feel it shd be frm sum to 0, coz the values are dependent on previous values like prev[j-num[i]]., getting wrong ans. explain y shd we go frm 0 to sum

    • @umeshhbhat
      @umeshhbhat 5 месяцев назад

      did you find answer for your query?@@dsp-io9cj

  • @gaurabdas6503
    @gaurabdas6503 2 года назад +2

    Understood!
    Also, we can solve the problem using just a single array (instead of two).
    int minimumElements(vector &num, int tar)
    {
    int n = num.size();

    vector prev(tar+1);

    for(int j=0 ; j

  • @ratinderpalsingh5909
    @ratinderpalsingh5909 2 года назад +1

    Understood, sir. Thank you very much.

  • @abhimanyuambastha2595
    @abhimanyuambastha2595 Месяц назад

    Can bound the time as O(2^(N+T)) where T is the total we need. Because at max each coin can be picked T times (if coin is value 1, else less times). And space O(N+T)

  • @sayantabhattacharjee9808
    @sayantabhattacharjee9808 7 месяцев назад

    Awesome.....Loved it

  • @saurabhrthakur
    @saurabhrthakur 3 месяца назад

    Understood!

  • @NARUTOUZUMAKI-bk4nx
    @NARUTOUZUMAKI-bk4nx 7 месяцев назад

    UNDERSTOOD 🔥 😊

  • @siddharth892
    @siddharth892 2 года назад

    Yesssss!!!. Did it on my own. Understood Sir ✅

  • @JustGyan
    @JustGyan 28 дней назад

    why we are not considering the base case of when target become zero?

  • @SumanSingh-gq5vn
    @SumanSingh-gq5vn Месяц назад

    Understood sir!

  • @AbhishekKumar-cv1dh
    @AbhishekKumar-cv1dh 8 месяцев назад

    Understooood 🔥🔥🔥🔥🔥

  • @113_manshi4
    @113_manshi4 Год назад

    Understood! Thank you so much!!

  • @sayakghosh5104
    @sayakghosh5104 2 года назад

    Understood, awesome explanation as always.!

  • @arihantjammar8888
    @arihantjammar8888 8 месяцев назад

    Understood 😊

  • @sanjanar9198
    @sanjanar9198 6 месяцев назад

    Understood 🔥

  • @pragyanandsingh6673
    @pragyanandsingh6673 5 месяцев назад

    Understood !!

  • @MukeshKumar-cc3uh
    @MukeshKumar-cc3uh 4 месяца назад

    Understood ❤

  • @yaserahmed9721
    @yaserahmed9721 2 года назад +32

    Wow i solved this problem today morning same way striver taught the previous topics!! You are rocking man

  • @karthikeyansivakkumar5075
    @karthikeyansivakkumar5075 2 года назад +1

    Understood Bro :) One Row solution is awesome :)

  • @harshitjaiswal9439
    @harshitjaiswal9439 Год назад

    Understood and great explanation as always!

  • @anweshabanerjee6241
    @anweshabanerjee6241 Год назад +2

    very much similar to combination sums that u taught..#striver takes us forward

  • @amithkoutinagaraj5419
    @amithkoutinagaraj5419 Год назад +1

    I have a doubt, the base condition when ind==0 , when this base case is reached from function call of not take ,code is returning value/coins[ind] for not take function call, but not-take means we are not taking a single coin, so how does it work?

  • @nainaprasad1174
    @nainaprasad1174 Год назад +2

    understood, i was able to write the recurrence solution without watching the vedio, thankyou striver

  • @nithishlelll9664
    @nithishlelll9664 6 месяцев назад

    understood!!😄

  • @ankitpandey7262
    @ankitpandey7262 2 года назад

    UNDERSTOOD !!! 🔥🔥🔥🔥🔥🔥
    As in DP19 similar this problem can also be done using only one single array ...

    • @MohammadKhan-ld1xt
      @MohammadKhan-ld1xt Год назад +1

      Here we require the curr array also as in tabulation you could see that for pick we were writing:
      pick = dp[index][sum-arr[index]];
      So index is not decreasing, that means we require the curr array.
      pick = curr[sum-arr[index]];
      In the previous question we did not require the curr array for current array(curr) to be computed.
      pick = dp[index-1][sum-arr[index]]; OR pick = prev[sum-arr[index]];
      Hope this helps!!!

    • @vaibhavkaul2029
      @vaibhavkaul2029 Год назад +1

      @@MohammadKhan-ld1xt I think we can do this using 1 array as well. Hint: just see that we only need one element from the prev array and that would already be stored in the single array we will be using. Also we go from left to right.

    • @priyanshkumariitd
      @priyanshkumariitd 14 дней назад

      @@vaibhavkaul2029 Yes, you're right. Thanks for this comment. You saved my time...

  • @mohdamaan5551
    @mohdamaan5551 Месяц назад

    Understood..!

  • @shresthjain7557
    @shresthjain7557 Месяц назад

    understood!

  • @santoshb7776
    @santoshb7776 7 месяцев назад

    Understood sir .

  • @pardhi8959
    @pardhi8959 2 месяца назад

    Understood.

  • @402saravana4
    @402saravana4 6 месяцев назад +3

    Dear Striver,
    In this problem, we are not checking the base case which occurs when the target is equal to 0 and index is not zero. This happens if ar=[1,2,3] and target = 9; then the index will stand on index 2 , recursive calling 3 times and mean while target becomes 0. So I think we have missed this case.
    Am I correct or lost anywhere ? Please explain
    Thank You.

    • @rishabhnema2479
      @rishabhnema2479 4 месяца назад

      See if it's stuck at index!=0 and target == 0 then it will give two calls of notpick & pick, pick will give 1e9. Notpick will give another function call, which might ultimately give 1e9 for both(pick,notpick). Check 19:30, he stopped (1,0) and if you dry run further for it you''d realise it gives 1e9 for both. Your test when run on codestudio gives the correct answer viz. 3.

  • @adarshparitosh5870
    @adarshparitosh5870 Год назад

    Understood, thank you so much sir for such content, trust me koi ye level de he ni sakta jo aap free me de rhe hai , mujhe dp khi smajh aya to TUF pe,thank you :)🙏

  • @srinathv1412
    @srinathv1412 6 месяцев назад

    Understood !!!!!

  • @rahulchoudhary29
    @rahulchoudhary29 5 месяцев назад

    Amazing content

  • @narendramaurya4823
    @narendramaurya4823 3 месяца назад

    understood ... 👍

  • @SatyamKumar-bw4vi
    @SatyamKumar-bw4vi 8 месяцев назад

    UNDERSTOOD

  • @satishsinghyadav4253
    @satishsinghyadav4253 Месяц назад

    His way of teaching never discriminates with a backbencher

  • @aasifali9139
    @aasifali9139 Год назад

    thx striver for this wonderful series.

  • @raviparihar3298
    @raviparihar3298 4 месяца назад

    thank you sir

  • @RajeshKumar._.16
    @RajeshKumar._.16 Год назад

    for(int i=0; i

  • @your_name96
    @your_name96 2 года назад +8

    I now know this is obvious but you could have told us why didn't you write base case for the second state T as well, it returns 0 when T == 0 , but would have been more complete that way, thanks for the video.

    • @yashaggarwal825
      @yashaggarwal825 2 года назад

      man did you get the answer coz i am wondering about this as well .why its rejection does'nt cause any problem to the code

    • @binitkumar314
      @binitkumar314 2 года назад +1

      it wont affect the code as think if target becomes zero before hitting index 0 , the only recursive call of not take will run , and it wont affect the number of coins !
      as there is a check before picking the coin arr[ind]

  • @sunilswami6796
    @sunilswami6796 2 года назад

    You r the best teacher brother🔥

  • @hardikgaur5182
    @hardikgaur5182 Год назад

    For me , it is the best yt channel , for coding related stuff❤

  • @arjunkhanna1803
    @arjunkhanna1803 2 года назад +5

    NOTE FOR SELF:
    When sum of smaller coins any of the larger coin then dp

    • @maneeshguptanalluru7807
      @maneeshguptanalluru7807 2 года назад

      @Arjun Khanna Great! could you explain the intuition behind the above conclusion!

    • @AMANKUMAR-eq6sq
      @AMANKUMAR-eq6sq 2 года назад +2

      ​@@maneeshguptanalluru7807 Greedy works perfectly in the case where law of uniformity is followed otherwise DP

  • @kaushikjain2266
    @kaushikjain2266 Месяц назад

    Understood

  • @pawanchandra9193
    @pawanchandra9193 Год назад +1

    For the recursive approach why don't we have a base case for (T==0) return 0; cuz as we can see at each stage we are either decreasing ind or target.
    But the code seem to work even without (T==0) case, WHY??

  • @GirishJain
    @GirishJain Год назад +2

    better to write if(target == 0){return 0} as base case as well in order to avoid stack overflow. Also I wonder how was this working without this base case

    • @deepanshujain9962
      @deepanshujain9962 Год назад +1

      I was thinking the same. Thanks for pointing it aloud.

    • @anuragprasad6116
      @anuragprasad6116 Год назад +1

      when target = 0, only the notTake call is made until ind==0. For ind==0, target%x is true thus target/x is return which would be 0. So return 0 case is still working though stack space will be wasted as you pointed out.

    • @GirishJain
      @GirishJain 11 месяцев назад

      @@anuragprasad6116 but what if target is 0 and index is not 0?

    • @stym134
      @stym134 13 дней назад

      @@GirishJain if target is 0 then it will not pick anything till index 0 and hence at base case ind==0, target%x is true thus target/x is return which would be 0.

  • @sameersahu4569
    @sameersahu4569 2 года назад

    Understood!!!Thank you

  • @abdurrazzaqqureshi4170
    @abdurrazzaqqureshi4170 2 года назад

    Awesome Explanation Striver bhaiya.
    Can we write the recursive code using the last tabular optimization approach(using prev and cur arrays)?
    Can you help me with that recursive code please. I tried it but not getting AC.

  • @ayushanand4337
    @ayushanand4337 Год назад +1

    Why we are declaring the curr array outside of for loop unlike the previous questions where we did it inside the first for loop?

  • @sauravchandra10
    @sauravchandra10 Год назад

    Understood, thanks!

  • @striver_108
    @striver_108 5 месяцев назад

    understood striver bro

  • @anishkumarde5505
    @anishkumarde5505 2 года назад

    In the space optimized code if we take it then the formula will be 1 + prev[T-nums[i]] right?

  • @UjjawalSaran
    @UjjawalSaran 16 дней назад

    understood

  • @dev-rock
    @dev-rock 2 года назад

    I solved a question using two different recursive approaches out of which one works and other takes too much time and I am not able to figure out what is the difference can you please help?

  • @vedantpatel5210
    @vedantpatel5210 10 месяцев назад

    Why are we taking cur[T - nums[ind] ] instead of prev[T - nums[ind] ] in space optimization? As per my understanding, we have been using prev row before updating the cur row in each iteration.

  • @mrinmoyhalder7293
    @mrinmoyhalder7293 2 года назад +2

    Hey , striver before seeing your Lecture I tried this qsn by myself and was able to came up with a recursion technique -
    if(i==0)
    {
    if(t%num[i]!=0)
    return -1;
    if(t%num[i]==0)
    return t/num[i];
    }
    if(t==0)
    return 0;
    if(dp[i][t]!= -2)
    return dp[i][t];
    int notpick= 0 + rec(i-1,t,num,dp);
    int min_pick=INT_MAX;
    for(int c=1;c

    • @neerajjoshi8285
      @neerajjoshi8285 Год назад

      Bhai exactly same the technique as your then striver bhiya told this one and I feel function call stack will be same so i just search on leetcode and submit over there it will be getting submitting but acception rate less then striver bhai solution but they both are exactly same technique why this is happening

  • @rishabhagarwal8049
    @rishabhagarwal8049 Год назад

    Understood Sir, thank you very much

  • @coderrr3353
    @coderrr3353 Год назад +1

    Can we do this using 1D dp also. Like arr[]={9 6 5 1} amount =11 first in the loop we will check for 9 since it is greater than 11 now we will go for f(11-9) se similarly all others.

  • @rishabhjain1694
    @rishabhjain1694 Год назад +1

    one doubt -> so here why can'nt we use the sorting on the coins[] array and start dividing it from the last by doing the soriting we can form the uniformity so we can use greedy isn;t it ? cause the order of the coins does'nt matter in this case