• [BZOJ1708][Usaco2007 Oct]Money奶牛的硬币


    1708: [Usaco2007 Oct]Money奶牛的硬币

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 802  Solved: 543 [Submit][Status][Discuss]

    Description

    在创立了她们自己的政权之后,奶牛们决定推广新的货币系统。在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值。在传统的货币系统中,硬币的面值通常是1,5,10,20或25,50,以及100单位的货币,有时为了更方便地交易,会发行面值为2单位的硬币。 奶牛们想知道,对于一个给定的货币系统,如果需要正好凑出一定数量的钱,会有多少种不同的方法。比如说,你手上有无限多个面值为{1,2,5,10,...}的硬币,并且打算凑出18单位货币,那么你有多种方法来达到你的目的:18*1,9*2,8*2+2*1,3*5+2+1,以及其他的未列出的若干方案。 请你写一个程序,帮奶牛们计算一下,如果想用有V (1 <= V <= 25)种面值的硬币,凑出总价值为N(1 <= N <= 10,000)的一堆钱,一共有多少种不同的方法。答案保证不会超出C/C++中的'long long',Pascal中的'Int64',或是Java中的'long'的范围。

    Input

    * 第1行: 2个用空格隔开的整数:V和N

    * 第2..V+1行: 每行1个整数,表示1种硬币面值

    Output

    * 第1行: 输出1个正整数,表示用这V种面值的硬币,凑出N单位的货币的不同方法总数。

    Sample Input

    3 10
    1
    2
    5

    Sample Output

    10
     
    背包
    #include <cstdio>
    #include <cstring>
    char buf[5000000], *ptr = buf - 1;
    inline int readint(){
        int n = 0;
        char ch = *++ptr;
        while(ch < '0' || ch > '9') ch = *++ptr;
        while(ch <= '9' && ch >= '0'){
            n = (n << 1) + (n << 3) + ch - '0';
            ch = *++ptr; 
        }
        return n;
    }
    typedef long long ll;
    ll dp[100010] = {0}; 
    int main(){
        fread(buf, sizeof(char), sizeof(buf), stdin);
        int V, N;
        V = readint();
        N = readint();
        dp[0] = 1;
        for(int t, i = 1; i <= V; i++){
            t = readint();
            for(int j = t; j <= N; j++) dp[j] += dp[j - t];
        }
        printf("%lld
    ", dp[N]);
        return 0;
    }
  • 相关阅读:
    ROS编程中使用rosed编写代码
    ROS中.launch文件的remap标签详解
    Ubuntu下网易云音乐无法联网的解决办法
    双舵轮AGV里程计、运动控制核心算法
    PID参数调整的口诀
    altium designer生成gerber步骤
    SLAM FOR DUMMIES 第5-8章 中文翻译
    SLAM for Dummies SLAM初学者教程 中文翻译 1到4章
    有关ros::spin()和ros::spinonce()若干感受
    ROS,launch学习
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7506483.html
Copyright © 2020-2023  润新知