<HAOI2008>硬币购物
和神奇dp的战斗
还有容斥原理
终于get到了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> using namespace std; int c[5],d[5],tot,s; long long dp[100010]; int main() { int i,j,k; for(i=1;i<=4;i++)scanf("%d",&c[i]); dp[0]=1; for(i=1;i<=4;i++) for(j=c[i];j<=100010;j++) dp[j]+=dp[j-c[i]];//背包aoaoaoaoaoaoao scanf("%d",&tot); for(k=1;k<=tot;k++) { long long ans=0; for(i=1;i<=4;i++)scanf("%d",&d[i]); scanf("%d",&s); for(i=0;i<=15;i++) { long long t=s; int cnt=0; for(j=1;j<=4;j++)if((i>>(j-1))&1)t-=c[j]*(d[j]+1),cnt^=1; if(t<0) continue; if(!cnt) ans+=dp[t];else ans-=dp[t]; } printf("%lld\n",ans); } return 0; }