COIN CHANGE PROBLEM

WHY MY CODE IS NOT WORKING <<< PLEASE HELP

class Solution {
public:

int helper(vector<int> &coins,int amount , vector<int> &dp,int n,int cnt=0) {        
    
    if(n==0) return INT_MAX;
    if(amount<0) return INT_MAX;
    if(amount == 0) return cnt;
    if(coins[n-1]>amount) return dp[amount]=helper(coins,amount,dp,n-1,cnt);
    
    if(dp[amount]!=-1) return dp[amount];
    
    
    // take the coin and stay there 
    int op1 = helper(coins,amount-coins[n-1],dp,n,cnt+1);
    
    //Ignore and move
    int op2 = helper(coins,amount,dp,n-1,cnt);
    
    
    // take the coin and move
    int op3 = helper(coins,amount-coins[n-1],dp,n-1,cnt+1);
    return dp[amount]=min(op1,min(op2,op3));    
}


int coinChange(vector<int>& coins, int amount) {
    int n = coins.size();
    vector<int> dp(amount+1,-1);
    //vector<vector<int>> dp(n+1,vector<int>(amount+1,-1));
    int x = helper(coins,amount,dp,n);  
    if(x==INT_MAX) return -1;
    return x;
}

};