bzoj-1042 硬币购物
来源:互联网 发布:特种设备考试软件 编辑:程序博客网 时间:2024/04/28 22:34
题意:
有四种面值的硬币ci,进行tot次购物;
每次购物每种硬币有di个,问买s元的物品有几种方法;
题解:
硬币面值只有四种,可以猜测到算法复杂度不会很大;
普通的背包无法限制di个这个条件;
而将di个硬币拆开复杂度无法承受,并且一样难以统计方案;
所以考虑容斥原理简化问题;
去掉di的限制,令f[x]表示四种硬币购买x元的物品有几种方法;
然后反向考虑,如果硬币1超过d1个的限制的时候,f[s-c1*(d1+1)]恰好为方案数;这个f数组可以在O(4*10^5)的复杂度处理;
用总方案减去这些方案数,容斥原理搞一下就好了;
总感觉自己的容斥有点奇怪。。不过反正乱搞能AC= =;
似乎要开long long;
代码:
#include<stdio.h>#include<string.h>#include<algorithm>#define N 100001using namespace std;typedef long long ll;int c[4],d[4];ll f[N],ans;void slove(int now,int val){int k=0;for(int i=0;i<4;i++){if(now&(1<<i)){k^=1;val-=c[i]*(d[i]+1);}}if(val<0)return ;ans+=(k?-1:1)*f[val];}int main(){int n,m,i,j,k;for(i=0;i<4;i++)scanf("%d",c+i);scanf("%d",&n);f[0]=1;for(i=0;i<4;i++){for(j=0;j<N;j++)f[j+c[i]]+=f[j];}for(i=1;i<=n;i++){for(j=0;j<4;j++)scanf("%d",d+j);scanf("%d",&m);ans=0;for(j=0;j<16;j++)slove(j,m);printf("%lld\n",ans);}return 0;}
0 0
- bzoj-1042 硬币购物
- bzoj 1042 硬币购物
- BZOJ[1042]硬币购物
- BZOJ 1042: [HAOI2008]硬币购物
- BZOJ 1042: [HAOI2008]硬币购物
- BZOJ 1042: [HAOI2008]硬币购物
- 【BZOJ 1042】 [HAOI2008]硬币购物
- [BZOJ 1042][HAOI2008]硬币购物
- BZOJ 1042: [HAOI2008]硬币购物
- 【bzoj】1042: [HAOI2008]硬币购物
- [bzoj]1042: [HAOI2008]硬币购物
- bzoj 1042 [HAOI2008]硬币购物
- BZOJ 1042 [HAOI2008] 硬币购物
- bzoj 1042: [HAOI2008]硬币购物
- bzoj 1042: [HAOI2008]硬币购物
- BZOJ 1042 [HAOI2008]硬币购物
- bzoj P1042 [HAOI2008]硬币购物
- BZOJ 1042 HAOI2008 硬币购物 背包+容斥原理
- Java基础--基本类型
- 多线程二(Runnable接口)
- 排序
- UIViewController的presentedViewController,presentingViewController和parentViewController三个属性
- OC 中的关键词 大全(1)
- bzoj-1042 硬币购物
- codevs contest #1 3944 幻影阁的难题 树形DP+二分
- Google推荐的图片加载库Glide介绍
- Android自动化测试工具汇总
- rownum进行分页查询
- uva 11374 Airport Express(最短路)
- nandflash读写是以page为单位的测试
- activity小结——知晓当前是在哪一个活动
- Eclipse 使用 && 快捷键