有一阵没写这道题,愣了一阵子。
刚开始在考虑用BFS来解,后来意识到这是不是求最少有多少个硬币而是有多少种。
而且是个combination而不是permutation
这种问题用dfs肯定可以做,但这种求有多少种的问题用DFS就不明智了。
这种一般是用DP来做
dp[i][j]的状态定义: 用前j种硬币组成i块钱时有多少种可能性。
这里要想一下,dp[i][j]一定要用上所有j种硬币吗?想了一下感觉没有必要加这个限制
induction rule
dp[i][j] = d[i][j - 1] 再加上下面的
如果i >= coin[j] 的话, 则再加上dp[i - coin[j]][j]. 取了一个coins[j] , 然后还可以继续取。
初始化时
dp[0][] = 1;
dp[ > 0][0] = 0;
代码见下:
public int change(int amount, int[] coins) {
//dp[i][j] 组成 i 块钱, 用 前j种币
int M = coins.length;
int[][] dp = new int[amount + 1][M + 1];
// dp[0][*] = 1;
for (int j = 0; j <= M; j++) dp[0][j] = 1;
//dp[*][0] = 0; * > 0
for (int i = 1; i <= amount; i++) {
for (int j = 1; j <= M; j++) {
dp[i][j] = dp[i][j - 1];
if (i >= coins[j - 1]) dp[i][j] += dp[i - coins[j - 1]][j];
}
}
return dp[amount][M];
}
网友评论