【无标题】
import java.math.BigInteger;
class Solution {
public int maxTotalReward(int[] rewardValues) {
Set<Integer> set = new HashSet<>();
int mx = 0;
for(int x : rewardValues){
set.add(x);
mx = Math.max(mx, x);
}
if(set.contains(mx - 1))
return mx * 2 - 1;
// 使用bitset优化,去除第一维维度
// 使用二进制保存状态,定义第j位为1表示f[j]=true
int[] nums = Arrays.stream(rewardValues).distinct().sorted().toArray();
BigInteger f = BigInteger.ONE;
for (int v : nums) {
BigInteger mask = BigInteger.ONE.shiftLeft(v).subtract(BigInteger.ONE);
BigInteger shiftLeft = f.and(mask).shiftLeft(v);
f = f.or(shiftLeft);
}
return f.bitLength() - 1;
}
}