• 洛谷P1450 [HAOI2008]硬币购物


    P1450 [HAOI2008]硬币购物

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

    每次的方法数

    输入输出样例

    输入样例#1:
    1 2 5 10 2
    3 2 3 1 10
    1000 2 2 2 900
    
    输出样例#1:
    4
    27
    

    说明

    di,s<=100000

    tot<=1000

    [HAOI2008]

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int c[5],T,cnt[5],s;
    int sum[1000000],num,ans,now;
    int main(){
        freopen("Cola.txt","r",stdin);
        scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&T);
        while(T--){
            scanf("%d%d%d%d%d",&cnt[1],&cnt[2],&cnt[3],&cnt[4],&s);
            memset(sum,0,sizeof(sum));ans=0;
            for(int i=0;i<=cnt[1];i++)
                for(int j=0;j<=cnt[2];j++){
                    now=i*c[1]+j*c[2];
                    if(now>s)break;
                    sum[now]++;
                }
            for(int i=0;i<=cnt[3];i++)
                for(int j=0;j<=cnt[4];j++){
                    now=i*c[3]+j*c[4];
                    if(now>s)break;
                    ans+=sum[s-now];
                }
            printf("%d
    ",ans);
        }
    }
    10分 meet in the middle
    /*
        不要忘了开longlong
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #ifdef WIN32
    #define PLL "%I64d"
    #else
    #define PLL "%lld"
    #endif
    using namespace std;
    int c[5],d[5],T;
    long long f[100010],ans;
    void dfs(int now,int cnt,int sum){
        if(now==5){
            if(cnt&1)ans-=f[sum];
            else ans+=f[sum];
            return;
        }
        dfs(now+1,cnt,sum);
        if(sum-(d[now]+1)*c[now]>=0)
        dfs(now+1,cnt+1,sum-(d[now]+1)*c[now]);
    }
    int main(){
        scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&T);
        f[0]=1;
        for(int i=1;i<=4;i++)
            for(int j=c[i];j<=100000;j++)f[j]+=f[j-c[i]];
        while(T--){
            int s;
            scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&s);
            ans=0;
            dfs(1,0,s);
            printf(PLL"
    ",ans);
        }
    }
    100分 完全背包+容斥原理
  • 相关阅读:
    OneNote 2010 文字识别
    Windows 7 添加网络共享打印机
    logstash
    filebeat
    记elk打包时的问题
    elasticsearch.yml
    zabbix 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
    mac装brew
    snmp监控
    博科光纤交换机端口别名映射脚本
  • 原文地址:https://www.cnblogs.com/thmyl/p/7688503.html
Copyright © 2020-2023  润新知