zoukankan      html  css  js  c++  java
  • 【bzoj1708/Usaco2007 Oct】Money奶牛的硬币——完全背包

    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
     

    就一道普通的完全背包,外层循环为面额,内层循环为凑出的钱数。
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 typedef long long LL;
     5 const int N=27;
     6 int v,n;
     7 LL a[N],f[10005];
     8 int read(){
     9     int ans=0,f=1;char c=getchar();
    10     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    11     while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();}
    12     return ans*f;
    13 }
    14 int main(){
    15     v=read();n=read();
    16     for(int i=1;i<=v;i++)a[i]=read();
    17     f[0]=1;
    18     for(int i=1;i<=v;i++)
    19         for(int j=0;j<=n;j++)
    20             if(a[i]<=j&&f[j-a[i]])f[j]+=f[j-a[i]];
    21     printf("%lld",f[n]);
    22     return 0;
    23 }
    bzoj1708
     
  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/JKAI/p/7544485.html
Copyright © 2011-2022 走看看