最后一块石头的重量II
力扣题目链接
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0;
for(int stone : stones){
sum += stone;
}
int target = sum/2;
vector<int> dp(target+1, 0);
for(int i = 0; i < stones.size(); i++){
for(int j = target; j >= stones[i]; j--){
dp[j] = max(dp[j], dp[j-stones[i]] + stones[i]);
}
}
return sum - 2 * dp[target];
}
};
目标和
力扣题目链接
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int num0 = 0;
int sum = 0;
for(int num : nums){
sum += num;
}
if(sum < target || (sum - target) %2 != 0)
return 0;
target = (sum - target)/2;
vector<int> dp(target+1, 0);
dp[0]= 1;
for(int num : nums){
if(num == 0){
num0++;
continue;
}
else{
for(int i = target; i >= num; i--){
dp[i] = dp[i-num] + dp[i];
}
}
}
int result = dp[target];
while(num0 > 0){
result *= 2;
num0--;
}
return result;
}
};
一和零
力扣题目链接
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> nums(strs.size(), vector<int>(2,0));
for(int i = 0; i < strs.size(); i++){
for(char ch : strs[i]){
if(ch == '0') nums[i][0]++;
else nums[i][1]++;
}
}
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(auto vec : nums){
for(int i = m; i >= vec[0]; i--){
for(int j = n; j >= vec[1]; j--){
dp[i][j] = max(dp[i][j], dp[i-vec[0]][j-vec[1]] + 1);
}
}
}
return dp[m][n];
}
};