diff --git a/src/problem/mod.rs b/src/problem/mod.rs index f833e6c..b81252e 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -584,3 +584,5 @@ mod p1123_lowest_common_ancestor_of_deepest_leaves; mod p1863_sum_of_all_subset_xor_totals; mod p368_largest_divisible_subset; + +mod p416_partition_equal_subset_sum; diff --git a/src/problem/p416_partition_equal_subset_sum.rs b/src/problem/p416_partition_equal_subset_sum.rs new file mode 100644 index 0000000..bac94e1 --- /dev/null +++ b/src/problem/p416_partition_equal_subset_sum.rs @@ -0,0 +1,58 @@ +/** + * [416] Partition Equal Subset Sum + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn can_partition(nums: Vec) -> bool { + let n = nums.len(); + if n < 2 { + return false; + } + + let nums: Vec = nums.into_iter().map(|x| x as usize).collect(); + let sum: usize = nums.iter().sum(); + + if sum % 2 != 0 { + return false; + } + + let middle = sum / 2; + let mut dp = vec![vec![false; middle + 1]; n]; + + // 初始化dp + for i in 0..n { + dp[i][0] = true; + } + if nums[0] <= middle { + dp[0][nums[0]] = true; + } + + for i in 1..n { + for j in 1..=middle { + if j < nums[i] { + dp[i][j] = dp[i - 1][j]; + } else { + dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]]; + } + } + } + + dp[n - 1][middle] + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_416() { + assert!(Solution::can_partition(vec![1, 5, 11, 5])); + assert!(!Solution::can_partition(vec![1, 2, 3, 5])); + } +}