class Solution {
public int change(int amount, int[] coins) {
if(coins == null || coins.length == 0){
return 0;
}
int[] weight = coins;
int[] value = coins;
int bagsize = amount;
int[][] dp = new int[weight.length][bagsize+1];
//初始化第一行,当将重量为 weight[0] 的物品0放满不同容量 j 的背包中
//只要能放满, 就只有一种方式,就是放 n 个物品0
//n = 容量/weight[0]
for(int j = 0; j <= bagsize; j++){
if( j % weight[0] == 0){
dp[0][j] = 1;
}
}
//注意,此处初始化二维dp数组时,应当将置dp[i][0] = 1
//不放也是一种方式(个人觉得求方式的应该都需要这么初始化,否则下面全是0了)
for(int i = 0; i < weight.length; i++){
dp[i][0] = 1;
}
for(int i = 1; i < weight.length; i++){
for(int j = 1; j <= bagsize; j++){
if(j < weight[i]){
dp[i][j] = dp[i-1][j];
}else{
//可以取也可以不取,方式一共是这么多
//注意完全背包和01背包的不同,就是dp[i][j-weight[i]]
//此处表示放完物品 i 之后还可以重复放置物品 i
dp[i][j] = dp[i-1][j] + dp[i][j-weight[i]];
}
}
}
//打印dp数组
for(int i = 0; i < weight.length; i++){
for(int j = 0; j <= bagsize; j++){
System.out.print(dp[i][j] + " ");
}
System.out.println(" ");
}
return dp[weight.length-1][bagsize];
}
}
零钱兑换II 二维dp数组方式
最新推荐文章于 2024-07-19 19:11:19 发布