20240825 finished.

This commit is contained in:
jackfiled 2024-08-25 13:11:03 +08:00
parent 3f326e3185
commit 852c0252d7
2 changed files with 64 additions and 1 deletions

View File

@ -216,3 +216,4 @@ mod p3007_maximum_number_that_sum_of_the_prices_is_less_than_or_equal_to_k;
mod p3133_minimum_array_end;
mod p3145_find_products_of_elements_of_big_array;
mod p3146_permutation_difference_between_two_strings;
mod p698_partition_to_k_equal_sum_subsets;

View File

@ -0,0 +1,62 @@
/**
* [698] Partition to K Equal Sum Subsets
*/
pub struct Solution {}
// submission codes start here
impl Solution {
pub fn can_partition_k_subsets(nums: Vec<i32>, k: i32) -> bool {
let target = nums.iter().sum::<i32>() / k;
if target * k != nums.iter().sum::<i32>() {
return false;
}
let mut nums = nums;
nums.sort();
if *nums.last().unwrap() > target {
return false;
}
let state = (1 << nums.len()) - 1;
let mut dp = vec![true; 1 << nums.len()];
Self::search(state, 0, &mut dp, target, &nums)
}
fn search(state: usize, now: i32, dp: &mut Vec<bool>, target: i32, nums: &Vec<i32>) -> bool {
if state == 0 {
return true;
}
if !dp[state] {
return dp[state];
}
dp[state] = false;
for (i, &n) in nums.iter().enumerate() {
if n + now > target {
break;
}
if (state >> i) & 1 == 1 && Self::search(state ^ (1 << i), (now + n) % target, dp, target, nums) {
return true;
}
}
false
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_698() {
assert!(Solution::can_partition_k_subsets(vec![4, 3, 2, 3, 5, 2, 1], 4));
}
}