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.
To maximize the total reward, we need to select values in an order such that each chosen value is greater than the current total. Sorting the values and using memoization allows us to efficiently explore all possible choices and avoid redundant calculations.
classSolution {
public:int maxReward(vector<int>& rewardValues) {
sort(rewardValues.begin(), rewardValues.end());
unordered_set<int> memo;
function<int(int, int)> dfs = [&](int x, int mask) {
if (memo.count(mask)) return0;
memo.insert(mask);
int ans = x;
for (int i =0; i < rewardValues.size(); ++i) {
if (!(mask & (1<< i)) && rewardValues[i] > x) {
ans = max(ans, dfs(x + rewardValues[i], mask | (1<< i)));
}
}
return ans;
};
returndfs(0, 0);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
funcmaxReward(rewardValues []int) int {
sort.Ints(rewardValues)
n:= len(rewardValues)
memo:=map[int]int{}
vardfsfunc(x, maskint) intdfs = func(x, maskint) int {
ifv, ok:=memo[mask]; ok { returnv }
ans:=xfori:=0; i < n; i++ {
ifmask&(1<<i) ==0&&rewardValues[i] > x {
ans = max(ans, dfs(x+rewardValues[i], mask|(1<<i)))
}
}
memo[mask] = ansreturnans }
returndfs(0, 0)
}
func max(a, bint) int { ifa > b { returna } else { returnb } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
publicintmaxReward(int[] rewardValues) {
Arrays.sort(rewardValues);
int n = rewardValues.length;
Map<Integer, Integer> memo =new HashMap<>();
return dfs(0, 0, rewardValues, memo);
}
privateintdfs(int x, int mask, int[] rewardValues, Map<Integer, Integer> memo) {
if (memo.containsKey(mask)) return memo.get(mask);
int ans = x;
for (int i = 0; i < rewardValues.length; ++i) {
if ((mask & (1 << i)) == 0 && rewardValues[i]> x) {
ans = Math.max(ans, dfs(x + rewardValues[i], mask | (1 << i), rewardValues, memo));
}
}
memo.put(mask, ans);
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 {
rewardValues.sort()
val n = rewardValues.size
val memo = mutableMapOf<Int, Int>()
fundfs(x: Int, mask: Int): Int {
if (mask in memo) return memo[mask]!!var ans = x
for (i in0 until n) {
if (mask and (1 shl i) ==0&& rewardValues[i] > x) {
ans = maxOf(ans, dfs(x + rewardValues[i], mask or (1 shl i)))
}
}
memo[mask] = ans
return ans
}
return dfs(0, 0)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
defmax_reward(reward_values: list[int]) -> int:
reward_values.sort()
n = len(reward_values)
memo: dict[int, int] = {}
defdfs(x: int, mask: int) -> int:
if mask in memo:
return memo[mask]
ans = x
for i in range(n):
ifnot (mask & (1<< i)) and reward_values[i] > x:
ans = max(ans, dfs(x + reward_values[i], mask | (1<< i)))
memo[mask] = ans
return ans
return dfs(0, 0)