题解 | #兑换零钱(一)#
兑换零钱(一)
https://www.nowcoder.com/practice/3911a20b3f8743058214ceaa099eeb45
写了老半天,用的是完全背包的思路,后来发现先遍历背包和先遍历物品是完全不一样的两个东西。
题解给的是先遍历背包空间dp[n],再遍历每个物品item,依次减去每个物品的值dp[n-item],求出最小值
我用的是先遍历物品,不能拿之后的物品,通过二维数组转移的形式解题,发现自己麻烦很多,以后可能多多使用先遍历空间的思路。
import java.util.*;
public class Solution {
/**
* 最少货币数
* @param arr int整型一维数组 the array
* @param aim int整型 the target
* @return int整型
*/
public void print(int[][] dp){
for (int i = 0; i < dp.length; i++) { //this equals to the row in our matrix.
for (int j = 0; j < dp[i].length; j++) { //this equals to the column in each row.
System.out.print(dp[i][j] + " ");
}
System.out.println(); //change line on console as row comes to end in the matrix.
}
}
public int minMoney (int[] arr, int aim) {
// write code here
int[][] dp = new int[arr.length + 1][aim + 1];
for (int i = 0; i < arr.length + 1; i++) {
for (int j = 0; j < aim + 1; j++) {
if (j == 0) dp[i][j] = 0;
else dp[i][j] = 99;
}
}
for (int i = 1; i < arr.length + 1; i++) {
for (int j = 1; j < aim + 1; j++) {
if (j >= arr[i-1]) {
dp[i][j] = Math.min(dp[i][j - arr[i-1]] + 1, dp[i - 1][j]);
}
else dp[i][j] = dp[i - 1][j];
}
}
// print(dp);
if (dp[arr.length][aim] == 99) return -1;
else return dp[arr.length][aim];
}
}
