Minimum Money Needed(basic test case is passing but shows wrong answer in all 3 test cases)

#include
#include<bits/stdc++.h>
using namespace std;
int **dp;
int GetMinCost(int *a,int n,int w)
{
//dp[0][0]=0;
for(int i=0;i<=n;i++){dp[i][0]=0;}//set first column to o
for(int j=1;j<=w;j++){dp[0][j]=INT_MAX-1001;}//set first row to INF
for(int i=1;i<=n;i++)
{
for(int j=1;j<=w;j++)
{

        if(a[i-1]==-1)
        {
        dp[i][j]=INT_MAX-1;

        }
        if(a[i-1]>j)//current wt is more than the current capacity
        {
            dp[i][j]=dp[i-1][j];
            // cout<<"i::"<<i<<"j::"<<j<<"dp::"<<dp[i][j]<<" ";
        }
        else if(a[i-1]<=j)
        {
            dp[i][j]=min(a[i-1]+dp[i-1][j-a[i-1]],dp[i-1][j]);
            // cout<<"xi::"<<i<<"j::"<<j<<"dp::"<<dp[i][j]<<" f1 "<<a[i-1]<<" f2 "<<dp[i-1][j-a[i-1]]<<" s "<<dp[i-1][j]<<endl;
        }
    }
    //cout<<endl;
}
//print the dp table

// for(int i=0;i<=n;i++)
// {
// for(int j=0;j<=w;j++)
// {
// cout<<setw(3)<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
return dp[n][w];

}
int main()
{ //cout<<“main”<<endl;
int n,w;
cin>>n>>w;
int a[w];
for(int i=0;i<w;i++)
{
cin>>a[i];
}
//dp array
dp=new int*[1001]; //rowcount
for(int i=0;i<1001;++i){ //
dp[i]=new int[1001];//col int *a=new int[100]
}

for(int i=0;i<=n;i++)
{
    for(int j=0;j<=w;j++)
    {//*(*(dp+i)+j)=-1 //dp[2][1]
        dp[i][j]=-1;
    }
}
int ans = GetMinCost(a,n,w);
cout<<ans<<endl;
return 0;

}