zoukankan      html  css  js  c++  java
  • 容斥原理--P1450 [HAOI2008]硬币购物

    公式:(mid igcuplimits_{i=1}^nS_imid = sumlimits_{m=1}^n{(-1)}^{m-1}sumlimits_{a_i<a_{i+1}} mid igcaplimits_{i=1}^m S_{a_i}mid)

    简单来说,就是被包含奇数次的加在一起减去被包含偶数次的,就是全集

    对于这道题,我们可以用所有方案减不合法的方案

    1. 所有方案:完全背包

    2. 不合法方案:包含(至少)一个不合法,两个不合法,三个不合法,四个不合法四种互相包含的情况,容斥求

    code

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define int long long
    using namespace std;
    int read(){
    	int x = 1,a = 0;char ch = getchar();
    	while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
    	while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
    	return x*a;
    }
    const int maxn = 1e5+10;
    int c[5],n;
    int d[5],s;
    int dp[maxn];
    signed main(){
    	for (int i = 1;i <= 4;i++) c[i] = read();n = read();
    	dp[0] = 1;
    	for (int i = 1;i <= 4;i++){
    		for (int j = 1;j <= 100000;j++){
    			if(j >= c[i]) dp[j] += dp[j-c[i]];
    		}
    	}
    	while (n--){
    		for (int i = 1;i <= 4;i++) d[i] = read();s = read();
    		int ans = dp[s],res = 0;
    		for (int i = 1;i < 16;i++){
    			int tmp = 0,cnt = 0;
    			for (int j = 1;j <= 4;j++){
    				if (i&(1<<j>>1)){
    					cnt++;
    					tmp += (d[j]+1)*c[j];
    				}
    			}
    			if (tmp > s) continue;
    			if (cnt&1) res += dp[s-tmp];
    			else res -= dp[s-tmp];
    		}
    		printf("%lld
    ",ans-res);
    	}
    	return 0;
    }
    
  • 相关阅读:
    sql-编程语句
    数据库语句基础3
    数据库语句 2
    sql常用的语句
    SQL语句
    锚点链接...
    sqlserver 三大范式
    sqlserver 约束
    c#SQLserver数据类型
    c#中switch语句用法
  • 原文地址:https://www.cnblogs.com/little-uu/p/14026967.html
Copyright © 2011-2022 走看看