卧薪尝胆,厚积薄发。
Our happy ending
Date: Thu Sep 20 20:39:36 CST 2018
In Category:
NoCategory
Description:
求长为
$n$
,由非负整数构成的,每个数都不超过
$l$
的,存在一个子序列和为
$k$
的序列的方案数。
$1\le n,k \le 20,1\le l \le 10^9$
Solution:
看到
$k$
这么小可以状压
$DP$
,设
$f[i][S]$
表示到了
$i$
,可以加和表示出的
$\le k$
的数的集合为
$S$
的方案数,把所有非负整数分为两类,小于等于
$k$
的和大于
$k$
小于等于
$l$
的,对于大的,一定不会在最终和为
$k$
的子序列中出现,所以
$f[i][S]+=(l-k)\times f[i-1][S]$
,对于小的,转移就是
$f[i][(S\text{ or }(S<<j))\text{ and }tot]+=f[i][S]$
。最后把所有有
$k$
的状态加起来即可。
复杂度
$T(20)\times n(20)\times 2^{k}(1048576)\times \min(k,l)(20)\approx 8.4\times 10^8$
,然而跑过了。
Code:
In tag:
DP-状压DP
Copyright © 2020
wjh15101051
ღゝ◡╹)ノ♡