zoukankan      html  css  js  c++  java
  • P1450 [HAOI2008]硬币购物

    P1450 [HAOI2008]硬币购物

    原题链接

    题面

    题目描述

    硬币购物一共有4种硬币。面值分别为(c_1,c_2,c_3,c_4)。某人去商店买东西,去了tot次。每次带(d_i)(c_i)硬币,买(s_i)的价值的东西。请问每次有多少种付款方法。

    输入格式

    第一行 (c_1,c_2,c_3,c_4,tot)
    下面(tot)(d_1,d_2,d_3,d_4,s)

    输出格式

    每次的方法数

    输入输出样例

    输入 #1

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

    输出 #1

    4
    27

    说明/提示

    (d_i,sleq100000,totleq1000)

    题解

    首先我们很容易想到暴力背包的做法,复杂度为(Theta(totcdot dcdot s))肯定会超时,于是此时我们就需要用到容斥背包

    数列的容斥原理在一个特征时体现为差分思想,我们考虑只有一种硬币。我们先进行一次无限背包,价格为i的方案数记为f[i],目标价记为sum,于是无限制的方案数为f[sum],不合法的方案数为f[tot-c(d+1)]。
    为什么呢?因为不合法即用了d+1个硬币,而所有用了d+1个硬币的状态必须经过f[tot-c
    (d+1)]才能转移到f[sum],于是我们的合法方案数就是f[sum]-f[tot-c*(d+1)]了

    对于多个限制的情况,(displaystyle f[sum]-f[tot-sum_{iin S} c_i(d_i+1)])就表示同时超额使用了S中的所有硬币种类的方案数,这就符合容斥原理,相当于我们可以求解任意集合的交集,最终要求所有集合并集的补集,这就很简单了,奇数次减偶数次加即可。

    至于枚举集合的交并情况,我们可以用二进制枚举,代码也很容易写

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int INF=1e9+7,MAXN=1e5+1,MAXC=5;
    int T,N,c[MAXC],d[MAXC];
    LL f[MAXN];
    int main(){
    	for(int i=1;i<=4;i++)
    		scanf("%d",c+i);
    	f[0]=1;
    	for(int i=1;i<=4;i++)
    		for(int j=c[i];j<MAXN;j++)
    			f[j]+=f[j-c[i]];
    	scanf("%d",&T);
    	while(T--){
    		LL sum,ans=0;
    		for(int i=1;i<=4;i++)
    			scanf("%d",d+i);
    		scanf("%lld",&sum);
    		for(int i=0;i<16;i++){/*binary*/
    			LL ii=sum,op=1;
    			for(int j=1;j<=4;j++){
    				if((i>>(j-1))&1){
    					ii-=c[j]*(d[j]+1);
    					op=-op;
    				}
    			}
    			if(ii<0)
    				continue;
    			ans+=op*f[ii];
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    SharePoint Framework (SPFx) 开发入门教程
    SharePoint 2013 Designer 入门教程
    SharePoint 2013 开发教程
    SharePoint 2013 入门教程
    SharePoint Online 部署SPFx Web部件
    SharePoint Online SPFx Web部件绑定数据
    SharePoint Online 创建SPFx客户端Web部件
    SharePoint Online 配置框架(SPFx)开发环境
    SharePoint Online 创建应用程序目录
    SharePoint Online 启用 IRM
  • 原文地址:https://www.cnblogs.com/guoshaoyang/p/11302208.html
Copyright © 2011-2022 走看看