容斥 + 背包 两则

洛谷 P1450

题目大意:

4种物品,每个物品都有它的体积(体积小于等于1e5).T( T ≤ 1000 T \leq1000 T1000)组询问,每组询问给出四个物品的数量(数量小于等于1e5),问组成S( S ≤ 1 e 5 S \leq 1e5 S1e5)的方案数.

题目思路:

这里利用了退背包和容斥定理的思想.

现在假设其他物品都是完全的,只有一个物品数量是受限的.那么我们可以利用退背包的思想,先写一个完全背包,然后再撤销.即超过的方案数为 f ( s − c [ i ] ∗ ( d [ i ] + 1 ) ) f(s - c[i]*(d[i] + 1)) f(sc[i](d[i]+1)).这个时候但是现在是四个物品都受限制.那就要用容斥定理(很巧妙).

四个物品同时受限的方案(相当于四个的并集) = 无受限方案 - 一个受限的方案 + 两个受限的方案 - 三个受限的方案 + 四个物品受限的方案.

所以 2 4 2^4 24枚举集合,容斥计算即可.注意同时超过两个物品的方案数满足叠加性.即同时超过物品1,物品2的方案数为 f ( s − c [ 1 ] ∗ ( d [ 1 ] + 1 ) − c [ 2 ] ∗ ( d [ 2 ] + 1 ) ) f(s - c[1]*(d[1] + 1)- c[2]*(d[2] + 1)) f(sc[1](d[1]+1)c[2](d[2]+1))

牛客练习赛64 D.宝石装箱

题目大意:

n颗宝石装进n个箱子使得每个箱子中都有一颗宝石。第i颗宝石不能装入第 a i a_i ai个箱子。求合法的装箱方案对 998244353 998244353 998244353取模。
两种装箱方案不同当且仅当两种方案中存在一颗编号相同的宝石装在不同编号的箱子中。

题目思路:容斥定理求错排的一种拓展形式.

核心思想:将"恰好"的条件转换成"至少",然后用容斥定理求出最后答案.

如果 a i a_i ai是一个排列,那么这个问题就变成了一个错排问题.考虑如何用容斥定理求错排问题

错排数 = 所有排列 - 至少有1个不错排的方案数 + 至少有两个不错排的方案数 - …

D ( n ) = ∑ i = 0 n ( − 1 ) i ∗ n ! i ! D(n) = \sum_{i=0}^{n}(-1)^i*\frac{n!}{i!} D(n)=i=0n(1)ii!n!

现在 a i a_i ai可能有重复的,所有不是简单的组合数求解了。考虑利用动态规划:令 g ( i , j ) g(i,j) g(i,j)代表前i位,恰好有j个位置不错排的方案数.

转移为: g ( i , j ) = g ( i − 1 , j ) + g ( i − 1 , j − 1 ) ∗ A [ i ] g(i,j) = g(i - 1,j) + g(i - 1 , j - 1) * A[i] g(i,j)=g(i1,j)+g(i1,j1)A[i]

解释:这j个不错排的位置可能全位于前 i - 1 个位置。有可能最后一个来自于第j位。第j位可能有A[i]个选择。所以乘上系数A[i].

之后 D ( n ) = ∑ i = 0 n g ( n , i ) ∗ ( n − i ) ! D(n) = \sum_{i=0}^{n}g(n,i)*(n - i)! D(n)=i=0ng(n,i)(ni)!

解释: g ( n , i ) g(n,i) g(n,i)代表恰好i个不错排。其他位置随便排才表示至少有i个不错排的方案数.

猜你喜欢

转载自blog.csdn.net/qq_35577488/article/details/108937340