LeetCode 1049. 最后一块石头的重量II
链接
class Solution {
public:
// 目标:尽量让石头分为重量相同的两堆
int lastStoneWeightII(vector<int>& stones) {
int sum = accumulate(stones.begin(), stones.end(), 0);
int w = sum / 2;
vector<int> dp(w + 1, 0);
for(int i = 0; i < stones.size(); i++) {
for(int j = w; j >= stones[i]; j--) {
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
return sum - dp[w] - dp[w];
}
};
LeetCode 494. 目标和
链接
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if(sum < abs(target) || (sum + target) % 2 == 1) {
return 0;
}
int w = (sum + target) / 2;
vector<int> dp(w + 1, 0);
dp[0] = 1;
for(int i = 0; i < nums.size(); i++) {
for(int j = w; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
return dp[w];
}
};
LeetCode 474. 一和零
链接
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m + 1, vector(n + 1, 0));
for(auto str: strs) {
int count_0 = 0, count_1 = 0;
for(auto ch : str) {
if(ch == '0') {
count_0++;
} else {
count_1++;
}
}
for(int i = m; i >=count_0; i--) {
for(int j = n; j >= count_1; j--) {
dp[i][j] = max(dp[i][j], dp[i - count_0][j - count_1] + 1);
}
}
}
return dp[m][n];
}
};