879. 盈利计划

这一题我只能想到DFS,在人数以及盈利两个约束下很难写DP,而且盈利约束还不是不大于,而是不小于,学学三叶的思路:
逻辑上说比较清楚,对于上一个状态需要的至少利润为负,那么显然等价于至少利润为0
不过,具体的还是需要看看转移图才懂
/// 879. 盈利计划pub fn profitable_schemes(n: i32, min_profit: i32, group: Vec<i32>, profit: Vec<i32>) -> i32 {let mod1 = (1e9 as i64 + 7);let (n, m, min) = (n as usize, group.len(), min_profit as usize);// m个任务,n个人,至少minlet mut f = vec![vec![vec![0 as i64; min + 1]; n + 1]; m + 1];for x in 0..=n {f[0][x][0] = 1;}for i in 1..=m {let peo = group[i-1] as usize;let pro = profit[i-1] as usize;for j in 0..=n {for k in 0..=min {f[i][j][k] = f[i-1][j][k];if j >= peo {f[i][j][k] += f[i-1][j-peo][max(k as i64 - pro as i64, 0) as usize];if f[i][j][k] >= mod1 { f[i][j][k] -= mod1; }}}}}println!("{:?}", f);f[m][n][min] as i32}
跑案例一:
53[2,2][2,3]// 输出的dp:// 第一维:物品,第二维:人数,第三维:至少利润[0: [// 初始化,物品0的所有人数的情况下,获取至少利润为0都有一种方案[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0]],1: [[1, 0, 0, 0],[1, 0, 0, 0],[2, 1, 1, 0], // 人数为2的时候,利润至少为0为2种,1为1种[2, 1, 1, 0],[2, 1, 1, 0],[2, 1, 1, 0]],2: [[1, 0, 0, 0],[1, 0, 0, 0],[3, 2, 2, 1],[3, 2, 2, 1],[4, 3, 3, 2],[4, 3, 3, 2]]]
