• 【BZOJ】【1042】【HAOI2008】硬币购物


    DP+容斥原理


      sigh……就差一点……

      四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$Aigcap Bigcap Cigcap D$的大小。

      全集很好算……一个完全背包>_>$4×10^5$就可以预处理出来……

      然后我sb地去算满足一个条件、两个条件……的方案数去了QAQ根本算不出来啊

      orz了hzwer的题解,其实是算 不满足一个条件、不满足两个条件…的方案数的,因为如果第一种硬币超了,说明用了d[1]+1个第一种硬币,剩下的随意!!!而这个剩下的部分就是 f[rest]!!所以就可以O(1)查询了……sad

      人太弱有些悲伤……

     1 /**************************************************************
     2     Problem: 1042
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:40 ms
     7     Memory:2052 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 1042
    11 #include<vector>
    12 #include<cstdio>
    13 #include<cstring>
    14 #include<cstdlib>
    15 #include<iostream>
    16 #include<algorithm>
    17 #define rep(i,n) for(int i=0;i<n;++i)
    18 #define F(i,j,n) for(int i=j;i<=n;++i)
    19 #define D(i,j,n) for(int i=j;i>=n;--i)
    20 #define pb push_back
    21 using namespace std;
    22 inline int getint(){
    23     int v=0,sign=1; char ch=getchar();
    24     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
    25     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
    26     return v*sign;
    27 }
    28 const int N=1e5+10,INF=~0u>>2;
    29 typedef long long LL;
    30 /******************tamplate*********************/
    31 int c[5],d[5],s,n;
    32 LL ans,f[N];
    33 void dfs(int x,int k,int sum){
    34     if (sum<0) return;
    35     if (x==5){
    36         if (k&1) ans-=f[sum];
    37         else ans+=f[sum];
    38         return;
    39     }
    40     dfs(x+1,k+1,sum-(d[x]+1)*c[x]);
    41     dfs(x+1,k,sum);
    42 }
    43 int main(){
    44 #ifndef ONLINE_JUDGE
    45     freopen("1042.in","r",stdin);
    46     freopen("1042.out","w",stdout);
    47 #endif
    48     F(i,1,4) c[i]=getint(); n=getint();
    49     f[0]=1;
    50     F(i,1,4) F(j,c[i],1e5) f[j]+=f[j-c[i]];
    51  
    52     F(i,1,n){
    53         F(i,1,4) d[i]=getint(); s=getint();
    54         ans=0;
    55         dfs(1,0,s);
    56         printf("%lld
    ",ans);
    57     }
    58     return 0;
    59 }
    60 
    View Code

    1042: [HAOI2008]硬币购物

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1282  Solved: 754
    [Submit][Status][Discuss]

    Description

    硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。

    Input

    第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s

    Output

    每次的方法数

    Sample Input

    1 2 5 10 2
    3 2 3 1 10
    1000 2 2 2 900

    Sample Output

    4
    27

    HINT

    数据规模

    di,s<=100000

    tot<=1000

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    RedHat 更新CentOS Yum源(转)
    ubuntu 印象笔记
    (转)FFMPEG filter使用实例(实现视频缩放,裁剪,水印等)
    (转)学习ffmpeg官方示例transcoding.c遇到的问题和解决方法
    源码调用ffmpeg库时,需要注意接口为C接口
    codeforces 722D Generating Sets 【优先队列】
    poj2970 The lazy programmer 【优先队列】
    codeblocks17.12 不能启动调试器
    Unity动画知识之二:Animator动画状态机
    关于unity里pbr技术和材质 unity5默认shader和传统的对比
  • 原文地址:https://www.cnblogs.com/Tunix/p/4428160.html
Copyright © 2020-2023  润新知