Two test cases failing

#include
#include
#include
#include

using namespace std;

int coinschange(int *coins, int n, int m, set<vector>&s, vectorout, int *dp){

if(n==0){

	sort(out.begin(),out.end());

	if(s.find(out)!=s.end())
		return 0;

	else{s.insert(out);
	
	return 1;}
	
}

if(n<0){
	return 0;
}

if(dp[n]!=0){
	return dp[n];
}

int ans=0;

for(int i=0; i<m; i++){

	out.push_back(coins[i]);

	dp[n]=coinschange(coins,n-coins[i],m,s,out,dp);

	ans+=dp[n];

	out.pop_back();

}

return ans;

}

int main(){

	int n;
	cin>>n;

	int m;
	cin>>m;

	int coins[m];

	for(int i=0; i<m; i++){

		cin>>coins[i];

	}

	int dp[100]={0};

	set<vector<int>>s;

	vector<int>out;

	cout<<coinschange(coins,n,m,s,out,dp);

return 0;

}