目录
题目:
代码(首刷看解析 2024年2月23日:
class Solution {
public:
bool canPartition(vector<int>& nums) {
/*因为数值 < 100, length < 200 , 数值 < 20000*/
vector<int> dp(10001, 0);
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 2 == 1) return false;
int target = sum / 2;
for (int i = 0; i < nums.size(); ++i) {
for (int j = target; j >= nums[i]; --j) {
dp[j] = max(dp[j], (dp[j - nums[i]]) + nums[i]);
}
}
if (dp[target] == target) return true;
return false;
}
};
代码(二刷看解析 2024年3月10日)
01背包不知其所以然
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 2 == 1) return false;
int target = sum / 2;
vector<int> dp(target + 1, 0);
for (int i = 0; i < nums.size(); ++i) {
for (int j = target; j >= nums[i]; --j) {
dp[j] = max(dp[j - nums[i]] + nums[i], dp[j]);
}
}
return dp[target] == target;
}
};
代码(三刷自解 2024年6月26日 go)
debug了几次debug对了,思路是没问题,就是小错误需要避免。go的小问题挺多,不知道cpp会不会好一点
func canPartition(nums []int) bool {
// 两个数组分割和相等,如果和是奇数不可能
var sum int
for _,v := range nums {
sum += v
}
if sum % 2 == 1 {
return false
}
// 如果是偶数,则若存在一种分割方式使得 newSum == sum / 2,则true,否则false
// 01背包: 背包总量w = sum / 2, 物品数量 = len(nums), 单个物品价值 == 单个物品重量 == nums[i]
// dp[i][j] 表示0~i个物品,总量为w存不存在一种刚刚好的方式 则 dp[i][j] = dp[i - 1][j] or dp[i - 1][j - num[i]] + nums[i]
dp := make([][]int, len(nums) + 1)
for k := range dp {
dp[k] = make([]int, sum / 2 + 1)
}
for i := 1; i < len(nums); i++ {
for j := 0; j <= sum / 2; j++ {
if j < nums[i] {
dp[i][j] = dp[i - 1][j]
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i])
}
}
}
return dp[len(nums) - 1][sum/2] == sum/2
}