P1474 [USACO2.3] Money System / [USACO07OCT]Cow Cash G

题目描述

母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统。由于它们特殊的思考方式,它们对货币的数值感到好奇。

传统地,一个货币系统是由 1 , 5 , 10 , 20 , 25 , 50 , 100 1,5,10,20,25,50,100 1,5,10,20,25,50,100 的单位面值组成的。

母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。

举例来说, 使用一个货币系统 ( 1 , 2 , 5 , 10 , … ) (1,2,5,10, \ldots) (1,2,5,10,) 产生 18 18 18 单位面值的一些可能的方法是: 18 × 1 , 9 × 2 , 8 × 2 + 2 × 1 , 3 × 5 + 2 + 1 18 \times 1, 9 \times 2, 8 \times 2+2 \times 1, 3 \times 5+2+1 18×1,9×2,8×2+2×1,3×5+2+1,等等。

写一个程序来计算有多少种方法用给定的货币系统来构造一定数量的面值。保证总数在 64 64 64 位带符号整数的范围内。

输入格式

第一行两个整数:货币系统中货币的种类数目 V V V 1 ≤ V ≤ 25 1 \leq V \leq 25 1V25)。要构造的数量钱是 N N N 1 ≤ N ≤ 10 , 000 1 \leq N \leq 10,000 1N10,000)。

第二行 V V V 个整数,代表所有可用的货币的面值。

输出格式

单独的一行,包含用这 V V V 种硬币凑足 N N N 单位货币的方案数。

输入输出样例 #1

输入 #1

3 10
1 2 5

输出 #1

10

说明/提示

翻译来自NOCOW

USACO 2.3

C++实现

#include
#include
#include
#define maxn 400010
#define ll long long//定义ll为long long
ll p[maxn];
ll v,n,sum[maxn],f[maxn];
using namespace std;
int main()
{
cin>>v>>n;
for(int i=1;i<=v;++i)
cin>>p[i];
f[0]=1;
for(int i=1;i<=v;++i)
for(int j=p[i];j<=n;++j)
f[j]=f[j]+f[j-p[i]];
printf(“%lld”,f[n]);
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

集算法之大成!助力oier实现梦想!

更多推荐