Introduction
给你一个非负整数n,再给你一个整数数组nums表示不同面值的硬币。
请你计算并返回可以凑成总金额n的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
n和nums都在int整数范围内
Input
第一行输入整数n和m。n表示总金额数(1<=n<=10000),m表示数组的元素个数。(1<=m<=10)
第二行输入互不相同的m个整数表示不同面值的硬币,每个数字用空格隔开。硬币面值不大于10000
Output
输出可以凑成总金额的硬币组合数
Sample
input
5 3
1 2 5
output
4
Solution
import java.util.Scanner;
public class Main {
static int n,m,ans=0;
static int[] arr;
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
n=s.nextInt(); m=s.nextInt();
arr=new int[m];
for(int i=0;i<m;i++){
arr[i]=s.nextInt();
}
int[] dp = new int[n + 1];
dp[0] = 1;
for (int coin : arr) {
for (int i = coin; i <= n; i++) {
dp[i] += dp[i - coin];
}
}
System.out.println( dp[n]);
}
}
Experience
刚开始想的是完全背包问题,感觉有些出入。通过类似的动态规划,然后就能求解出。
它的一维优化,和完全背包问题的一维优化类似。