1049. 最后一块石头的重量 II
题目链接:https://leetcode.cn/problems/last-stone-weight-ii/submissions/
代码:
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 half = sum/2;
for(int i = 0; i < stones.size(); i++)
{
for(int j = half; j >= stones[i]; j--)
{
dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
return sum - dp[half] * 2;
}
};
昨天没想明白 睡了一觉会了
494. 目标和
题目链接:https://leetcode.cn/problems/target-sum/submissions/
代码(背包):
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;
if((sum + target)%2 == 1)
return 0;
int mid = (sum + target)/2;
vector<int> dp(mid+1,0);
dp[0] = 1;
for(int i = 0 ; i < nums.size(); i++)
{
for(int j = mid; j >= nums[i]; j--)
{
dp[j] += dp[j-nums[i]];
}
}
return dp[mid];
}
};
代码(回溯):
class Solution {
public:
int res = 0;
int findTargetSumWays(vector<int>& nums, int target) {
traceback(0,nums,target,0);
return res;
}
void traceback(int startIndex,vector<int>& nums,int target,int cur_sum)
{
if(startIndex == nums.size() - 1)
{
if(cur_sum - nums[startIndex] == target)
res ++;
if(cur_sum + nums[startIndex] == target)
res ++;
else
return;
return;
}
traceback(startIndex + 1, nums,target,cur_sum + nums[startIndex]);
traceback(startIndex + 1, nums,target,cur_sum - nums[startIndex]);
return;
}
};
474.一和零
题目链接:https://leetcode.cn/problems/ones-and-zeroes/
代码:
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); // 默认初始化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];
}
};
这道题本周日再做一遍