1042: [HAOI2008]硬币购物

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1042

dp预处理+容斥原理。
f[i]表示利用4种面值不限制个数得到i元的方案。
ans=f[s]-f[s-c1*(d1+1)]-f[s-c2*(d2+1)]……+f[s-c1*(d1+1)-c2*(d2+1)]……(容斥原理)
#include <iostream>
#include 
<cstring>
#include 
<cstdlib>
#include 
<cstdio>
using namespace std;
const int MaxS=100001;

int c[5],d[5],tot;
long long f[MaxS],ans;

void treat()
{
    memset(f,
0,sizeof(f));
    f[
0]=1;
    
for (int i=1;i<=4;i++)
        
for (int j=c[i];j<=MaxS;j++)
        
{
            f[j]
+=f[j-c[i]];
           
// cout<<j<<' '<<f[j]<<endl;
        }

}


void dfs(int now,int state,int s)
{
    
if (s<0 || now>5)
    
{
        
return;
    }

    ans
+=state*f[s];
    
for (int i=now;i<=4;i++)
    
{
        dfs(i
+1,-state,s-(d[i]+1)*c[i]);
    }

}


int main()
{
    cin
>>c[1]>>c[2]>>c[3]>>c[4]>>tot;
    treat();
    
for (int i=0;i<tot;i++)
    
{
        
int s;
        cin
>>d[1]>>d[2]>>d[3]>>d[4]>>s;
        ans
=0;
        dfs(
1,1,s);
        cout
<<ans<<endl;
    }

    
return 0;
}


posted on 2013-02-14 14:21 Kiro 阅读(98) 评论(0)  编辑 收藏 引用 所属分类: 衡八oj