BZOJ-1042 硬币购物

DP+容斥原理。。。

我们先预处理出无限制(无限)背包的情况

然后Answer就是全部无限制的情况总数减去某个物品超过限制的情况总数。

设0000为全部无限制的情况,0101为C2,C4超过限制(其余无限制)的情况总数,其他的同理。

则Answer=0000-0001-0010-0100-1000-1100-1010-1001-0110-0101-0011-1110-1101-1011-0111-1111

但是,我们会发现,0001的情况包括了1001,0101,0011,1101,1011,0111,1111的情况,所以到最后会导致某一种情况被重复减去。

于是我们就得用到容斥原理了。

最后可得:

Answer=全部无限制情况-奇数个超过限制情况(奇数个1的情况)+偶数个超过限制情况(偶数个1的情况)

 

P.S:价值为S且C1的数量大于D1的情况总数为W[S-(D1+1)*C1]

 

【Code】

 

posted @ 2014-11-26 19:37  NanoApe  阅读(128)  评论(0编辑  收藏  举报
AmazingCounters.com