int solve(vector<int> nutrition, vector<int> price, int k, int m){ //C++20
vector<vector<int>> dp(m+1, vector<int>(k+1));
for (int a = 0; a < ssize(price); ++a){ // for each item
for (int i = min(k, a+1); ~i; --i){ // for each discount remaining
for (int j = m; j >= price[a]/2; --j){ // for all possible money
if (j >= price[a] && a >= i){ // if current money is enough to buy no discount and that there is no discount used more than current item index
dp[j][i] = max(dp[j][i], dp[j-price[a]][i] + nutrition[a]);
}
if (i){ // if we have discount left.
dp[j][i] = max(dp[j][i], dp[j-price[a]/2][i-1] + nutrition[a]);
}
}
}
}
return dp[m][k];
}
Test Cases
cout << solve({20,17,15},{2,4,5},1,4) << '\n';
cout << solve({9,10},{10,20},1,10) << '\n';
C:\WINDOWS\system32\cmd.exe /c (a)
37
10
Hit any key to close this window...