子集和四
子集和(回溯法)
题目描述
给定 n 个整数 a_1,a_2, ,⋯,an 构成一个集合(集合里允许出现相同大小的数字),请问其中有多少个子集的和是 k 的倍数(不算空集)?
![](https://img-blog.csdnimg.cn/44ee035e798d48998b70a97f60092179.png)
定义数组
dp[i][j] 表示取前i个数得所有子集和,模上 T=j的方案数,易得j<k
最后的答案是dp[n][0]-1 ,边界条件 dp[0][0]=1,因为空集也是一个方案数,最后减掉即可。
dp 具体操作以及状态转移方程
我们知道这里有两种可能
1.不取a[i] 这个数,那么可以表示为
dp[i][j]=dp[i−1][j],因为没有取,跟之前的方案数一样。
2.取这个数,那方案数为