use std::ops::Add;
pub fn subset_sum<T>(set: &[T], sum: T) -> bool
where
T: Copy + Add<Output = T> + PartialEq + From<u8> + Ord + Into<usize>,
{
let n = set.len();
let sum_usize = <T as Into<usize>>::into(sum);
let mut dp = vec![vec![false; sum_usize + 1]; n + 1];
for i in 0..=n {
dp[i][0] = true;
}
for i in 1..=n {
for j in 1..=sum_usize {
let set_elem_usize = <T as Into<usize>>::into(set[i - 1]);
if set_elem_usize > j {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j] || dp[i - 1][j - set_elem_usize];
}
}
}
dp[n][sum_usize]
}