zoukankan      html  css  js  c++  java
  • 【题解】HAOI2008硬币购物

    1A什么的实在是太开心啦~~洛谷P1450

    这道题目主要是考察对于容斥原理的掌握。

    首先,注意到如果不存在有关硬币数量的限制而单纯询问方案的总数,就是一个简单的完全背包。这个思路提醒我们:如果能够求出所有不合法的方案,是不是就可以相减得到我们想要的答案了呢?那么我们注意到:令A[i]为第i种硬币超出范围的方案总数,显然有A[i]=dp[s-(d[i]+1)*c[i]]:强行超出,注意d[i]+1因为可以达到d[i];剩下的就套容斥原理的公式即可:

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define V 100000
    #define ll long long
    int s, c[5], T, a[5], d[5];;
    ll dp[V + 9];
    int read()
    {
        int x = 0;
        char c;
        c = getchar();
        while(c < '0' || c > '9') c = getchar();
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x;
    }
    
    ll Get_Ans()
    {
        ll ans = 0;
        for(int i = 1; i <= 4; i ++)
            a[i] = (d[i] + 1) * c[i];
        for(int i = 1; i <= 4; i ++)
            if(a[i] <= s) ans += dp[s - a[i]];
        for(int i = 1; i <= 4; i ++)
            for(int j = i + 1; j <= 4; j ++)
                if((a[i] + a[j]) <= s) ans -= dp[s - a[i] - a[j]];
        for(int i = 1; i <= 4; i ++)
            for(int j = i + 1; j <= 4; j ++)
                for(int k = j + 1; k <= 4; k ++)
                    if(a[i] + a[j] + a[k] <= s) ans += dp[s - a[i] - a[j] - a[k]];
        if(a[1] + a[2] + a[3] + a[4] <= s) ans -= dp[s - a[1] - a[2] - a[3] - a[4]];
        return dp[s] - ans; 
    }
    
    int main()
    {
        for(int i = 1; i <= 4; i ++) c[i] = read();
        T = read();
        dp[0] = 1;
        for(int i = 1; i <= 4; i ++)
            for(int j = c[i]; j <= V; j ++)
                dp[j] += dp[j - c[i]];
        for(int i = 1; i <= T; i ++)
        {
            for(int j = 1; j <= 4; j ++) d[j] = read();
            s = read();
            printf("%lld
    ", Get_Ans());
        }
        return 0;
    }
  • 相关阅读:
    LeetCode: Tags-[Array], Difficulty-[Medium]
    J2SE 常用方法
    LeetCode: Tags-[Array], Difficulty-[Easy]
    Java Code Style 记录
    LintCode 1-30;
    Android在线程中发送GET和POST请求 在主线程更新UI
    Android中intent启动Activity中intent.setFlags()的作用
    源码备份 listview
    android数据库操作
    android 验证二
  • 原文地址:https://www.cnblogs.com/twilight-sx/p/8417592.html
Copyright © 2011-2022 走看看