zoukankan      html  css  js  c++  java
  • 洛谷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分 完全背包+容斥原理
  • 相关阅读:
    php设计模式-装饰器模式
    php设计模式-观察者模式
    play-with-docker搭配ffsend完成文件上传及下载(解决从docker hub拉取镜像慢问题)
    java执行命令行,以及解决卡死问题
    在docker容器中调用docker命令
    MIME 类型,ContentType
    大文件下载---之内存溢出问题解决
    OperationCenter Docker运行环境及其依赖启动脚本
    快速获取批量处理Docker镜像SQL语句
    解决达梦数据库新增大字段报错问题
  • 原文地址:https://www.cnblogs.com/thmyl/p/7688503.html
Copyright © 2011-2022 走看看