zoukankan      html  css  js  c++  java
  • bzoj 1042: [HAOI2008]硬币购物【容斥原理+dp】

    当然是容斥啦。
    用dp预处理出( f[i] ),表示在( i )价格时不考虑限制的方案数,转移方程是( f[i]+=f[i-c[j]] ),用状压枚举不满足的状态容斥一下即可。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const long long N=100005;
    long long c[10],T,d[10],s,f[N],ans;
    long long read()
    {
    	long long r=0;
    	char p=getchar();
    	while(p>'9'||p<'0')
    		p=getchar();
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r;
    }
    int main()
    {
    	c[1]=read(),c[2]=read(),c[3]=read(),c[4]=read(),T=read();
    	f[0]=1;
    	for(long long j=1;j<=4;j++)
    		for(long long i=1;i<=N-5;i++)
    			if(i>=c[j])
    				f[i]+=f[i-c[j]];
    	while(T--)
    	{
    		ans=0ll;
    		d[1]=read(),d[2]=read(),d[3]=read(),d[4]=read(),s=read();
    		for(long long i=0;i<=15;i++)
    		{
    			long long t=1,sum=s;
    			for(long long j=1;j<=4;j++)
    				if(i&(1<<(j-1)))
    				{
    					t=-t;
    					sum-=(d[j]+1)*c[j];
    				}
    			if(sum>=0)
    				ans+=t*f[sum];
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    常用的正则表达式
    Spring
    Hibernate-04
    Hibernate-03
    Hibernate-02
    Hibernate-01
    装饰器(python)
    软件工程之小组选题报告
    小组项目之需求分析与原型设计
    关于group_concat函数拼接字符超长的问题
  • 原文地址:https://www.cnblogs.com/lokiii/p/8215260.html
Copyright © 2011-2022 走看看