2021寒假每日一题《货币系统》
货币系统
题目来源:usaco training 2.3
时间限制:1000ms 内存限制:64mb
题目描述
给定 \(V\) 种货币(单位:元),每种货币使用的次数不限。
不同种类的货币,面值可能是相同的。
现在,要你用这 \(V\) 种货币凑出 \(N\) 元钱,请问共有多少种不同的凑法。
输入格式
第一行包含两个整数 \(V\) 和 \(N\)。
接下来的若干行,将一共输入 \(V\) 个整数,每个整数表示一种货币的面值。
输出格式
输出一个整数,表示所求总方案数。
数据范围
\(1 ≤ V ≤ 25\) ,
\(1 ≤ N ≤ 10000\) ,
答案保证在 C/C++:long long
Java:long
范围内。
样例输入
3 10
1 2 5
样例输出
10
解题思路
解题代码-Java
import java.util.*;
public class Main {
static long getPlanCount(int[] money, int n) {
int len = money.length;
long[][] dp = new long[len + 1][n + 1];
dp[0][0] = 1;
for (int i = 1; i <= len; i++) {
int vi = money[i - 1];
for (int j = 0; j <= n; j++) {
dp[i][j] = dp[i - 1][j];
if (j >= vi) {
dp[i][j] += dp[i][j - vi];
}
}
}
return dp[len][n];
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int v = input.nextInt();
int n = input.nextInt();
int[] money = new int[v];
for (int i = 0; i < v; i++) {
money[i] = input.nextInt();
}
input.close();
System.out.println(getPlanCount(money, n));
}
}