int f(int ind,int target,vector<int>& a,vector<vector<int>>& dp) { int pick,nonPick; if(ind==0) { if(target%a[0]==0)return target/a[0]; else return INT_MAX; } if(dp[ind][target]!=-1)return dp[ind][target]; nonPick = f(ind-1,target,a,dp); pick = 1e9; if(a[ind]<=target) pick = 1+f(ind,target-a[ind],a,dp); return dp[ind][target]=min(pick,nonPick); } int coinChange(vector<int>& coins, int amount) { int n = coins.size(); vector<vector<int>> dp(n,vector<int>(amount+1,-1)); int res =f(n-1,amount,coins,dp); return (res>=1e9)?-1:res; }