class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
//获取长度
int n = triangle.size();
//创建数组
vector<vector<int>> f(n, vector<int>(n));
//初始化
f[0][0] = triangle[0][0];
//进行循环
for (int i = 1; i < n; ++i) {
f[i][0] = f[i - 1][0] + triangle[i][0];
for (int j = 1; j < i; ++j) {
f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j];
}
f[i][i] = f[i - 1][i - 1] + triangle[i][i];
}
//返回最小值
return *min_element(f[n - 1].begin(), f[n - 1].end());
}
};
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
//无法分割
if (n < 2) {
return false;
}
//元素和
int sum = accumulate(nums.begin(), nums.end(), 0);
//最大元素
int maxNum = *max_element(nums.begin(), nums.end());
//sum是奇数无法分割
if (sum & 1) {
return false;
}
//目标值为和的一半
int target = sum / 2;
//如果最大元素大于目标值 也无法分割
if (maxNum > target) {
return false;
}
//创建dp[n][target + 1]
vector<vector<int>> dp(n, vector<int>(target + 1, 0));
//target为0 全都满足
for (int i = 0; i < n; i++) {
dp[i][0] = true;
}
//第一个数字选择也满足
dp[0][nums[0]] = true;
for (int i = 1; i < n; i++) {
int num = nums[i];
for (int j = 1; j <= target; j++) {
//元素值小于目标值
//分为两种情况
//选择num dp[i - 1][j - num]
//不选择num dp[i - 1][j]
if (j >= num) {
dp[i][j] = dp[i - 1][j] | dp[i - 1][j - num];
//元素值大于目标值
//不能选择
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
//返回是否存在0-n-1 存在和等于目标值的
return dp[n - 1][target];
}
};
class Solution {
public:
//neg为前面加上- 的元素的和
//(sum−neg)为前面加上+ 的元素的和
//(sum−neg)−neg=sum−2⋅neg=target
//neg=(sum−target)/2
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
for (int& num : nums) {
sum += num;
}
int diff = sum - target;
//sum−target非负偶数
if (diff < 0 || diff % 2 != 0) {
return 0;
}
int n = nums.size(), neg = diff / 2;
//创建dp[n + 1][target + 1]
vector<vector<int>> dp(n + 1, vector<int>(neg + 1));
//target为0 全都满足
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
int num = nums[i - 1];
for (int j = 0; j <= neg; j++) {
//元素值小于目标值
//分为两种情况
//选择num dp[i - 1][j - num]
//不选择num dp[i - 1][j]
if (j >= num) {
dp[i][j] = dp[i - 1][j]+dp[i - 1][j - num];
//元素值大于目标值
//不能选择
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][neg];
}
};