巨魔有金币
题目描述
某巨魔去了一趟拍卖行卖东西,赚了不少金币。
该巨魔由于报复社会不成被社会报复后决定报复做题的众人。
已知现在在WOW中有
4
种面值的金币(我骗你们的,我说了我要报复你们!哦呵呵!),面值大小分别为
巨魔问你
T
次,每次询问:当他有
输入格式
第一行
接下来
输出格式
输出
样例输入
1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
样例输出
4
27
数据范围
100% 的数据 1≤T≤1000 、 1≤si , V≤100000 。
Solution
同 硬币找零
Code
#include <iostream>
#include <cstdio>
#define LL long long
using namespace std;
LL c[10],T;
LL s[10],v;
LL f[100010];
int main(){
freopen("gold.in","r",stdin);
freopen("gold.out","w",stdout);
for(int i=1;i<=4;i++)scanf("%lld",&c[i]);scanf("%lld",&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--){
for(int i=1;i<=4;i++)scanf("%lld",&s[i]);
scanf("%lld",&v);
LL ans=f[v];
for(int i=1;i<=4;i++)
if((s[i]+1)*c[i]<=v)
ans-=f[v-(s[i]+1)*c[i]];
for(int i=1;i<=4;i++)
for(int j=i+1;j<=4;j++)
if((s[i]+1)*c[i]+(s[j]+1)*c[j]<=v)
ans+=f[v-(s[i]+1)*c[i]-(s[j]+1)*c[j]];
for(int i=1;i<=4;i++)
for(int j=i+1;j<=4;j++)
for(int k=j+1;k<=4;k++)
if((s[i]+1)*c[i]+(s[j]+1)*c[j]+(s[k]+1)*c[k]<=v)
ans-=f[v-((s[i]+1)*c[i]+(s[j]+1)*c[j]+(s[k]+1)*c[k])];
if((s[1]+1)*c[1]+(s[2]+1)*c[2]+(s[3]+1)*c[3]+(s[4]+1)*c[4]<=v)
ans+=f[v-((s[1]+1)*c[1]+(s[2]+1)*c[2]+(s[3]+1)*c[3]+(s[4]+1)*c[4])];
printf("%lld\n",ans);
}
return 0;
}