Input: rewardValues =[1,1,3,3]Output: 4Explanation:
During the operations, we can choose to mark the indices 0 and 2in order, and
the total reward will be 4, which is the maximum.
This problem is a variant of the subset sum with a greedy twist: you can only add a reward if it is greater than your current total. By using a bitmask to represent which indices are marked, and dynamic programming to store the best total for each mask, we can efficiently explore all possible choices.
classSolution {
publicintmaxReward(int[] rewardValues) {
int n = rewardValues.length;
Arrays.sort(rewardValues);
int[] dp =newint[1 << n];
int ans = 0;
for (int mask = 0; mask < (1 << n); ++mask) {
int x = dp[mask];
for (int i = 0; i < n; ++i) {
if ((mask & (1 << i)) == 0 && rewardValues[i]> x) {
int newMask = mask | (1 << i);
dp[newMask]= Math.max(dp[newMask], x + rewardValues[i]);
ans = Math.max(ans, dp[newMask]);
}
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funmaxReward(rewardValues: IntArray): Int {
val n = rewardValues.size
rewardValues.sort()
val dp = IntArray(1 shl n)
var ans = 0for (mask in0 until (1 shl n)) {
val x = dp[mask]
for (i in0 until n) {
if ((mask and (1 shl i)) ==0&& rewardValues[i] > x) {
val newMask = mask or (1 shl i)
dp[newMask] = maxOf(dp[newMask], x + rewardValues[i])
ans = maxOf(ans, dp[newMask])
}
}
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
defmax_reward(reward_values: list[int]) -> int:
n = len(reward_values)
reward_values.sort()
dp = [0] * (1<< n)
ans =0for mask in range(1<< n):
x = dp[mask]
for i in range(n):
ifnot (mask & (1<< i)) and reward_values[i] > x:
new_mask = mask | (1<< i)
dp[new_mask] = max(dp[new_mask], x + reward_values[i])
ans = max(ans, dp[new_mask])
return ans