您的位置:首页 > 其它

bzoj 1042 硬币购物

2015-11-16 10:38 155 查看
预处理+1,-1容斥即可,还是想不明白spring为什么要×组合数
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>

#define md
#define ll long long
#define inf (int) 1e9
#define eps 1e-8
#define N 100010
#define mxn 100000
using namespace std;
ll f
,ans=0;
ll w[4],hv[4];
int s;
void dp()
{
	f[0]=1;
	for (int i=0;i<=3;i++)
	  for (int j=w[i];j<=mxn;j++)
	    f[j]+=f[j-w[i]];
}

ll solve(int opt)
{
	ll sum=0;
	for (int i=0;i<=3;i++) if (opt&(1<<i)) sum+=w[i]*(hv[i]+1);
	if (sum>s) return 0;
	return f[s-sum];
}

ll bit(int opt)
{
	int sum=0;
	for (int i=0;i<=3;i++) sum+=(opt>>i)&1;
	return sum;
}

int main()
{
	int pos;
	scanf("%lld%lld%lld%lld%d",&w[0],&w[1],&w[2],&w[3],&pos);
	dp();
	for (int i=1;i<=pos;i++)
	{
		ans=0;
		scanf("%lld%lld%lld%lld%lld",&hv[0],&hv[1],&hv[2],&hv[3],&s);
		for (int j=0;j<=15;j++)
		  if (bit(j)&1) ans-=solve(j); else ans+=solve(j);
		printf("%lld\n",ans);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: