Help me in solving ARRREM problem

My issue

why my dp solution is giving wrong answer?

My code

#include <bits/stdc++.h>
using namespace std;

int maxi;

bool isofform2x_1(int num) {
    if (num <= 0) return false;
    
    return (num & (num + 1)) == 0;
}

void solve(vector<int> &v, int ind, int ans, int taken) {
    if (ind >= v.size()) {
        if (isofform2x_1(ans)) {
            maxi = max(taken, maxi);
        }
        return;
    }
    
    if (isofform2x_1(ans)) {
        maxi = max(taken, maxi);
    }
    
    // take
    int x = ans | v[ind];
    solve(v, ind + 1, x, taken + 1);
    
    // not take
    solve(v, ind + 1, ans, taken);
}

int main() {
    // your code goes here
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> v(n);
        
        for (int i = 0; i < n; i++) {
            cin >> v[i];
        }
        
        maxi = 0; 
        solve(v, 0, 0, 0);
        
        cout << n-maxi << endl;
    }
    return 0;
}

Problem Link: Array Removal Practice Coding Problem

@polaroid86
no need to apply dp for this problem , its a simple greedy approach.
plzz refer the following c++ code for better understanding

#include <iostream>
using namespace std;

int main() {
	// your code goes here
	int t;
	cin>>t;
	while(t--)
	{
	    long long int n;
	    cin>>n;
	    long long int a[n];
	    long long int sm=0,p=1;
	    for(int i=0;i<n;i++)
	    {
	        cin>>a[i];
	        sm=sm|a[i];
	    }
	    while(p<=sm)
	    {
	        long long ch=p&sm;
	        if(ch!=p)
	        {
	            break;
	        }
	        else
	        p=p*2;
	    }
	    int ans=0;
	    for(int i=0;i<n;i++)
	    {
	        if(a[i]>=p)
	        ans++;
	    }
	    cout<<ans<<endl;
	}
	return 0;
}