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 }
弱者究竟为何而战?!