首页 > 代码库 > 泥点spot

泥点spot

Spot 
描述 
有n个泥点,排成一排,第i个泥点坐标为ai。有m个木板,第i个木板长为li。现在用尽可能少的木板覆盖所有泥点。 
问:使用木板的最少数量以及最优方案数(mod 1000000007),若不能完全覆盖,请输出“NO”。 
注意: 
泥点可重复覆盖,木板可重叠。 
计算方案时,长度相等的两个板不等价,视为两种板。 
输入 
第1行:一个数n 
第2行:n个数a1,a2…an(从小到大给出) 
第3行:一个数m 
第4行:m个数l1,l2…ln 
输出 
第1行,一个数,使用木板的最少数量 
第2行,一个数,最优方案数 
若不能完全覆盖,请输出“NO” 
样例输入 



10 
样例输出 

10 
数据范围和约定 
对于20%的数据:n=1 
对于另外20%的数据:m=1 
对于100%的数据: 
1<=n,m<=15 
0<=ai<=1000000000 
1<=li<=1000000000 
时空限定 
内存限制为 512 MB 
时间限制为 1 s 
评测环境和细则 
评测开启-O2优化 
评测软件为lemon 
评测忽略行尾空格 
文件名 
提交文件名为spot.cpp/pas 
输入文件名为spot.in 
输出文件名为spot.out

n,m<=15,先确定是状压

一开始f[i][j],i表示前i个木板,j压的是泥点 
再用g[i][j] 在dp的时候记录方案数 
但是要考虑的情况会多到爆炸 
在卡了一个下午后,本蒟蒻毅然决然的决定 换!状!态!!!!

用f[i][j],i表示前i个泥点,j压的是木板,f[i][j]表示方案数 
初始化成负数 
最后再扫一遍f[n][0-maxp],找不是负数中最小的,没找着就输出”NO” 
这样比以前的好处是: 
泥点最后一定要全都选完,但木板不一定,比较好转移。

错误的第一次code

泥点spot