视频讲解:https://www.bilibili.com/video/BV14M411C7oV
https://programmercarl.com/1049.%E6%9C%80%E5%90%8E%E4%B8%80%E5%9D%97%E7%9F%B3%E5%A4%B4%E7%9A%84%E9%87%8D%E9%87%8FII.html
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int> dp(15001,0);
int sum = 0;
for(int i=0;i<stones.size();i++)
sum+=stones[i];
int target = sum/2;
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-dp[target])-dp[target];
}
};
视频讲解:https://www.bilibili.com/video/BV1o8411j73x
https://programmercarl.com/0494.%E7%9B%AE%E6%A0%87%E5%92%8C.html
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
int sum = 0;
for(int i=0;i<nums.size();i++) {
sum+=nums[i];
}
if(abs(S)>sum)
return 0;
if((S+sum)%2 == 1)
return 0;
int bagSize = (S+sum)/2;
vector<int> dp(bagSize+1,0);
dp[0] = 1;
for(int i=0;i<nums.size();i++) {
for(int j=bagSize;j>=nums[i];j--) {
dp[j] += dp[j-nums[i]];
}
}
return dp[bagSize];
}
};
视频讲解:https://www.bilibili.com/video/BV1rW4y1x7ZQ
https://programmercarl.com/0474.%E4%B8%80%E5%92%8C%E9%9B%B6.html
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 oneNum=0,zeroNum=0;
for(char c:str) {
if(c=='0')
zeroNum++;
else
oneNum++;
}
for(int i=m;i>=zeroNum;i--) {
for(int j=n;j>=oneNum;j--) {
dp[i][j] = max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);
}
}
}
return dp[m][n];
}
};