这段代码给出了在动态规划中使用 0/1 背包概念的最小硬币找零解决方案。在这里,我将要填充的二维矩阵的第 0 行初始化为 Integer.MAX_VALUE-1 并更新每个面额条目的值,以相应地在问题中求和。矩阵的最后一个元素给出了解决方案,即达到总和的最小硬币数量。如果没有通过给定的面额获得适当的总和,我返回-1。
public static int coinsChange(int denomination[],int sum){
Arrays.sort(denomination);
int[][] coins = new int[denomination.length+1][sum+1];
for(int sumIdx = 0; sumIdx<= sum;sumIdx++){
coins[0][sumIdx] = Integer.MAX_VALUE-1;
}
for(int i =1;i<=denomination.length;i++){
for(int j = 1;j<=sum;j++){
if(j>=denomination[i-1]){
coins[i][j]=Integer.min(coins[i-1][j],coins[i][j-denomination[i-1]]+1);
}
else{
coins[i][j] = coins[i-1][j];
}
}
}
if (coins[denomination.length][sum] == Integer.MAX_VALUE-1){
System.out.println("No solution found");
return -1;
}
return coins[denomination.length][sum];
}