class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
int sum = 0;
for (auto each : stones) {
sum += each;
}
// 目标值(容量)为总和的一半
int target = sum/2;
// 价值量没有负数,且在max中不影响,因此初始化为0
// dp[j]表示容量为j的背包最多装的价值量(weight = value)
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 - dp[target]*2);
}
};
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
for (auto each : nums) {
sum += each;
}
if (abs(target) > sum){
return 0;
}
if ((sum + target) % 2 == 1) {
// 奇数
return 0;
}
int realTarget = (sum + target)/2;
vector<int> dp(realTarget + 1, 0);
dp[0] = 1;
for (int i = 0; i < nums.size(); i++) {
for (int j = realTarget; j >= nums[i]; j--) {
dp[j] += dp[j-nums[i]];
}
}
return dp[realTarget];
}
};
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 x = 0;
int y = 0;
// 遍历每一个x和y的数量,分别代表0的值和1的值
for (int i = 0; i <str.size(); i++) {
if (str[i] == '0') {
x++;
}
else
y++;
}
// i j遍历顺序可以改变
for (int i = m; i >= x; i--) {
for (int j = n; j >= y; j--) {
dp[i][j] = max(dp[i][j], dp[i-x][j-y] + 1);
}
}
}
// 从左上角到右下角
return dp[m][n];
}
};