动态规划part05 1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
1049. 最后一块石头的重量 II
和416. 分割等和子集很像,直接上代码:
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0;
for(int i = 0; i<stones.size();i++) sum+=stones[i];
vector<int> dp(sum/2+1);
for(int i = 0; i<stones.size();i++){
for(int j = sum/2; j>=stones[i];j--){
dp[j] = max(dp[j],dp[j - stones[i]]+stones[i]);
}
}
return sum - 2*dp[sum/2];
}
};
494. 目标和
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
for(int i= 0;i<nums.size();i++){
sum+=nums[i];
}
if (abs(target) > sum) return 0;//target绝对值过大,sum无论如何都不能满足target
if((target+sum)%2) return 0; //如果target非偶数,直接返回0
target = (target+sum)/2; //(target+sum)/2
vector<int> dp(target+1);
dp[0] = 1;
for(int i =0; i<nums.size();i++){
for(int j = target; j>=nums[i];j--){
dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
};
474. 一和零
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for(string str:strs){
int zeros =0;
int ones = 0;
for(int i = 0; i < str.size(); i++){
if(str[i] == '0') zeros++;
else ones++;
}
for(int i = m; i>= zeros;i--){
for(int j = n; j>=ones;j--){
dp[i][j] = max(dp[i][j],dp[i-zeros][j-ones]+1);
}
}
}
return dp[m][n];
}
};