货币系统

题目描述

母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。由于他们特殊的思考方式,他们对货币的数值感到好奇。传统上,一个货币系统是由1元,5元,10元,20元 或 25元,50元, 和100元的面额组成的。
母牛想知道有多少种不同的方法来用货币系统中的各种货币来凑成某一个确定的总金额。 举例来说, 使用一个货币系统 {1,2,5,10,…}产生18元的一些可能的方法是:18*1, 9*2, 8*2+2*1, 3*5+2+1,等等。
写一个程序来计算有多少种方法用给定的货币系统来构造某个数值的总金额。
题目保证答案在long long (C/C++) 和 Int64 (Free Pascal)范围内。

输入

第 1 行: 2个整数V 和 N。V表示货币面额的种类数 (1<= V<=25)。N表示要构造的总金额 (1<= N<=10,000)。
第 2 行: V 个空格分开的整数,表示V种货币面额。

输出

第1行:1个整数,表示可能的构造的方案数。

样例输入

3 10
1 2 5

样例输出

10

分析

这道题可以近似的看作是一道完全背包问题,不过这里并不是要求总数,而是给定目标值和货币,要求你求方案数。
我们用a[]表示货币,用b[]表示方案总数,那么答案就是b[k]
所以状态转移方程为b[j]=b[j]+b[j-a[i]]

代码

#include<iostream>
using namespace std;
long long a[30],b[10005];
int main()
{
    ios::sync_with_stdio(false);
    long long n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    b[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=a[i];j<=k;j++)
            b[j]+=b[j-a[i]];
    cout<<b[k]<<endl;
    return 0;
}
posted @ 2017-08-25 10:21  SteinGate  阅读(185)  评论(0编辑  收藏  举报