题目描述
硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。
输入输出格式
输入格式:第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s
输出格式:每次的方法数
输入输出样例
输入样例#1:
1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900
输出样例#1:
4 27
说明
di,s<=100000
tot<=1000
[HAOI2008]
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int c[5],T,cnt[5],s; int sum[1000000],num,ans,now; int main(){ freopen("Cola.txt","r",stdin); scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&T); while(T--){ scanf("%d%d%d%d%d",&cnt[1],&cnt[2],&cnt[3],&cnt[4],&s); memset(sum,0,sizeof(sum));ans=0; for(int i=0;i<=cnt[1];i++) for(int j=0;j<=cnt[2];j++){ now=i*c[1]+j*c[2]; if(now>s)break; sum[now]++; } for(int i=0;i<=cnt[3];i++) for(int j=0;j<=cnt[4];j++){ now=i*c[3]+j*c[4]; if(now>s)break; ans+=sum[s-now]; } printf("%d ",ans); } }
/* 不要忘了开longlong */ #include<iostream> #include<cstdio> #include<cstring> #ifdef WIN32 #define PLL "%I64d" #else #define PLL "%lld" #endif using namespace std; int c[5],d[5],T; long long f[100010],ans; void dfs(int now,int cnt,int sum){ if(now==5){ if(cnt&1)ans-=f[sum]; else ans+=f[sum]; return; } dfs(now+1,cnt,sum); if(sum-(d[now]+1)*c[now]>=0) dfs(now+1,cnt+1,sum-(d[now]+1)*c[now]); } int main(){ scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&T); f[0]=1; for(int i=1;i<=4;i++) for(int j=c[i];j<=100000;j++)f[j]+=f[j-c[i]]; while(T--){ int s; scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&s); ans=0; dfs(1,0,s); printf(PLL" ",ans); } }