class Solution {
public:
int maxTotalReward(vector<int>& rewardValues) {
ranges::sort(rewardValues);
int n=rewardValues.size();
int MaxSum=2*rewardValues.back();
// MaxSum=2*2000-1也可以
vector<vector<bool> > dp(n+1,vector<bool>(MaxSum+1,false));
dp[0][0]=true;
for(int i=1;i<=n;i++){
int v=rewardValues[i-1];
for(int j=0;j<=MaxSum;j++){
if(j>=v){
dp[i][j]=dp[i-1][j] || dp[i-1][j-v] && j-v<v;
}else{
dp[i][j]=dp[i-1][j];
}
}
}
for(int i=MaxSum;i>=0;i--){
if(dp[n][i])
return i;
}
return 0;
}
};
变相背包问题