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.