BZOJ1042 [HAOI2008]硬币购物

递推+容斥原理

这个题做的晕的不行,实在是糟,等回头什么时候在做一次吧。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 int c[5],d[5];
 5 long long f[100005];
 6 int main()
 7 {
 8     for(int i = 1;i<=4;++i)scanf("%d",&c[i]);
 9     f[0] = 1;
10     for(int j = 1;j<=4;++j)
11         for(int i = c[j];i<=100000;i++)
12             f[i]+=f[i-c[j]];
13     int T;scanf("%d",&T);
14     while(T--){
15         for(int i = 1;i<=4;++i)scanf("%d",d+i);
16         int s;scanf("%d",&s);
17         long long ans = f[s];
18         for(int i = 1;i<16;++i){
19             int sum = 0,cnt = 0;
20             for(int j = 1;j<=4;++j)
21                 if(i&(1<<(j-1))){
22                     cnt++;
23                     sum+=(d[j]+1)*c[j];
24                 }
25             if(s>=sum){
26                 if(cnt%2)ans-=f[s-sum];
27                 else ans+=f[s-sum];
28             }
29         }
30         printf("%lld\n",ans);
31     }
32     return 0;
33 }

 

posted on 2015-08-03 02:10  round_0  阅读(147)  评论(0编辑  收藏  举报

导航