Leetcode 3180. 执行操作可获得的最大总奖励 I

f(i,j)表示从前i个中选,奖励为j是否有方案,有则为1。f(i,j) |= f(i-1,j),表示不选第i个。若是要选第i个,则需要j-rewardValues[i] < rewardValues[i],表示选第i个时手上的价值小于第i个的价值。

 1 const int N = 2010;
 2 int f[N][N*2];
 3 class Solution {
 4 public:
 5     int maxTotalReward(vector<int>& r) {
 6         memset(f,0,sizeof f);
 7         sort(r.begin(),r.end());
 8         vector<int> R={0};
 9         for(auto x:r){
10             R.push_back(x);
11         }
12         f[0][0]=1;
13         int n=r.size();
14         for(int i=1;i<=n;i++){
15             for(int j=0;j<N*2;j++){
16                 f[i][j]|=f[i-1][j];
17                 if(j-R[i]>=0&&j-R[i]<R[i])
18                     f[i][j]|=f[i-1][j-R[i]];
19             }
20         }
21         int res=0;
22         for(int i=0;i<2*N;i++){
23             if(f[n][i])
24                 res=i;
25         }
26         return res;
27     }
28 };

 

posted on 2024-10-25 22:49  greenofyu  阅读(6)  评论(0编辑  收藏  举报