【BZOJ】【1042】【HAOI2008】硬币购物
DP+容斥原理
sigh……就差一点……
四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigcap C\bigcap D$的大小。
全集很好算……一个完全背包>_>$4×10^5$就可以预处理出来……
然后我sb地去算满足一个条件、两个条件……的方案数去了QAQ根本算不出来啊
orz了hzwer的题解,其实是算 不满足一个条件、不满足两个条件…的方案数的,因为如果第一种硬币超了,说明用了d[1]+1个第一种硬币,剩下的随意!!!而这个剩下的部分就是 f[rest]!!所以就可以O(1)查询了……sad
人太弱有些悲伤……
1 /************************************************************** 2 Problem: 1042 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:40 ms 7 Memory:2052 kb 8 ****************************************************************/ 9 10 //BZOJ 1042 11 #include<vector> 12 #include<cstdio> 13 #include<cstring> 14 #include<cstdlib> 15 #include<iostream> 16 #include<algorithm> 17 #define rep(i,n) for(int i=0;i<n;++i) 18 #define F(i,j,n) for(int i=j;i<=n;++i) 19 #define D(i,j,n) for(int i=j;i>=n;--i) 20 #define pb push_back 21 using namespace std; 22 inline int getint(){ 23 int v=0,sign=1; char ch=getchar(); 24 while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} 25 while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} 26 return v*sign; 27 } 28 const int N=1e5+10,INF=~0u>>2; 29 typedef long long LL; 30 /******************tamplate*********************/ 31 int c[5],d[5],s,n; 32 LL ans,f[N]; 33 void dfs(int x,int k,int sum){ 34 if (sum<0) return; 35 if (x==5){ 36 if (k&1) ans-=f[sum]; 37 else ans+=f[sum]; 38 return; 39 } 40 dfs(x+1,k+1,sum-(d[x]+1)*c[x]); 41 dfs(x+1,k,sum); 42 } 43 int main(){ 44 #ifndef ONLINE_JUDGE 45 freopen("1042.in","r",stdin); 46 freopen("1042.out","w",stdout); 47 #endif 48 F(i,1,4) c[i]=getint(); n=getint(); 49 f[0]=1; 50 F(i,1,4) F(j,c[i],1e5) f[j]+=f[j-c[i]]; 51 52 F(i,1,n){ 53 F(i,1,4) d[i]=getint(); s=getint(); 54 ans=0; 55 dfs(1,0,s); 56 printf("%lld\n",ans); 57 } 58 return 0; 59 } 60
1042: [HAOI2008]硬币购物
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1282 Solved: 754
[Submit][Status][Discuss]
Description
硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。
Input
第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s
Output
每次的方法数
Sample Input
1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
3 2 3 1 10
1000 2 2 2 900
Sample Output
4
27
27
HINT
数据规模
di,s<=100000
tot<=1000