题目来源:usaco training 2.3
时间限制:1000ms 内存限制:64mbjava
给定 \(V\) 种货币(单位:元),每种货币使用的次数不限。
不一样种类的货币,面值多是相同的。
如今,要你用这 \(V\) 种货币凑出 \(N\) 元钱,请问共有多少种不一样的凑法。shell
第一行包含两个整数 \(V\) 和 \(N\)。
接下来的若干行,将一共输入 \(V\) 个整数,每一个整数表示一种货币的面值。spa
输出一个整数,表示所求总方案数。code
\(1 ≤ V ≤ 25\) ,
\(1 ≤ N ≤ 10000\) ,
答案保证在 C/C++:long long
Java:long
范围内。内存
3 10 1 2 5
10
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)); } }