您的位置:首页 > 其它

bzoj 1042: [HAOI2008]硬币购物

2014-02-01 17:05 239 查看
网上题解一搜一大把我就不献丑了,直接放代码吧

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
#define N 100008
#define M 1008

long long  S,F
,n,C[5],T,A[M][5];

void init()
{
for (int i = 1;i <= 4;i++) scanf("%d",&C[i]);
F[0] = 1;
scanf("%lld",&T);
for (int i = 1;i <= T;i++)
{
for (int j = 1;j <= 4;j++) scanf("%d",&A[i][j]);
scanf("%lld",&A[i][0]);
S = max(S,A[i][0]);
}
}

void DP()
{
for (int i = 1;i <= 4;i++)
for (int j = 0;j <= S;j++)
if (C[i]+j <= S) F[C[i]+j] += F[j];
}

void work()
{
for (int i = 1;i <= T;i++)
{
long long ans = 0;
long long  S = A[i][0];
ans += F[S];
for (int j = 1;j <= 4;j++)
if (S - (A[i][j]+1)*C[j] >= 0)
{
ans -= F[S - (A[i][j]+1)*C[j]];
for (int k = j+1;k <= 4;k++)
if (S - (A[i][j]+1)*C[j] - (A[i][k]+1)*C[k] >= 0)
{
ans += F[S - (A[i][j]+1)*C[j] - (A[i][k]+1)*C[k]];
for (int l = k+1;l <= 4;l++)
if (S - (A[i][j]+1)*C[j] - (A[i][k]+1)*C[k] - (A[i][l]+1)*C[l] >= 0)
{
ans -= F[S - (A[i][j]+1)*C[j] - (A[i][k]+1)*C[k] - (A[i][l]+1)*C[l]];
for (int m = l+1;m <= 4;m++)
if (S - (A[i][j]+1)*C[j] - (A[i][k]+1)*C[k] - (A[i][l]+1)*C[l] - (A[i][m]+1)*C[m] >= 0)
ans +=F[S - A[i][j]+1*C[j] - (A[i][k]+1)*C[k] - (A[i][l]+1)*C[l] - (A[i][m]+1)*C[m]];
}
}
}
printf("%lld\n",ans);
}

}

int main()
{
init();
DP();
work();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: