bzoj 1042 DP+容斥原理

我们可以先DP预处理出W[I]代表买I的东西,每种钞票的个数

不做限制的方案数,那么对于每一组数据的限制,我们可以知道

W[S-C[I]*(D[I]+1)]C为面值,D为数量,这个代表第I种钞票一定

超了的方案数,那么假设我们用二进制来表示对于四种钞票的限制情况

0000表示都不限制,1000代表第一种必须用超,其余没有限制

我们要求的是都限制的请款

那么根据容斥原理,我们可以知道答案是都不限制的-有奇数个1的情况+偶数个1的情况

dfs处理16种情况就好了

/**************************************************************
    Problem: 1042
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time:68 ms
    Memory:1008 kb
****************************************************************/
 
//By BLADEVIL
var
    i, j                        :longint;
    c, d                        :array[0..5] of longint;
    t, s                        :longint;
    w                           :array[0..100010] of int64;
    ans                         :int64;
     
procedure dfs(now,sum,flag:longint);
begin
    if sum<0 then exit;
    if now=5 then
    begin
        if flag=0 then
            ans:=ans+w[sum] else
            ans:=ans-w[sum];
        exit;
    end;
    dfs(now+1,sum,flag);
    dfs(now+1,sum-c[now]*(d[now]+1),flag xor 1);
end;
     
begin
    for i:=1 to 4 do read(c[i]);
    read(t);
    w[0]:=1;
    for i:=1 to 4 do
        for j:=c[i] to 100000 do w[j]:=w[j]+w[j-c[i]];
     
    for i:=1 to t do
    begin
        for j:=1 to 4 do read(d[j]);
        read(s);
        ans:=0;
        dfs(1,s,0);
        writeln(ans);
    end;
end.

 

posted on 2013-12-25 09:24  BLADEVIL  阅读(655)  评论(0编辑  收藏  举报