Pranzo della nonna con Knapsack Problem

ho rivisto il problema e ho risolto in questo modo:

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

int N, K;
bool dp[5001][10001]; 
int v[5001];

int main() { 
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);

	cin >> N >> K;

	int mas = INT_MAX;

	for(int i = 1; i <= N; ++i) {
		cin >> v[i];
		if(v[i] >= K) {
			mas = max(mas, v[i]);
		}		

	}
	//soluzione se c'e' un valore maggiore uguale K

	if(mas != INT_MAX) {
		cout << mas;
		return 0;
	}
	
	sort(v, v + N);
	//numero minimo di colonne
	long sum = 0;
	
	for(int i = 1; i <= N; ++i) {
		if(sum >= K) break;
		sum += v[i];
	}

	for(int i = 1; i <= N; ++i) {
		for(int j = 1; j <= sum; ++j) {
			if(i == 0) {
				dp[i][v[i]] = 1;
				break;
			}

			if(j == v[i]) dp[i][j] = 1;
			else {
				if(j < v[i]) {
					dp[i][j] = dp[i - 1][j];
				}
				else {
					dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]]);
				}
			}
			

		}
	}

	
	for(int i = K; i <= sum; ++i) {
		if(dp[N][i]) {
			cout << i;
			return 0;
		}	
	}
        cout << sum;
	return 0;
}

Non ho utilizzato la ricorsione, ancora faccio fatica a utilizzarla con questo problema.
Si potrebbe ottimizzare la mia soluzione?