LeetCode--322:零钱兑换(java)

原题链接
思路:动态规划

  • 状态定义 dp[i]:表示兑换 i 元需要的最少钱币数
  • dp方程:dp[i] = min{ dp [ i - coins[ j ]] } + 1(+1表示我自己需要使用一张,j 是遍历 coins 数组的下标)
public int coinChange(int[] coins, int amount) {
		//coins = [1,2,5,7,10]   金额14
        int[] dp = new int[amount+1];
        for(int i = 0;i <= amount;i++) {
        	dp[i] = -1; //最初所有金额的最优解均为-1(不可到达)
        }
        //dp = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]     
        dp[0] = 0; //金额0 的最优解为0
        //dp = [0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
        for(int i = 1;i <= amount;i++) { //循环各个面值,找到dp[i]的最优解
        	for(int j = 0;j < coins.length;j++) {
        	//如果兑换总额 >= 当前钱币面额 并且 上个状态的最优解是可行的
        		if(i - coins[j] >= 0 && dp[i-coins[j]] != -1) { //coins[j] 代表索引为 j 的面值
        		//dp[i] =-1表示当前状态还未更新  || 当前的dp[i] 的可行解 不如 dp[i - coins[j]] + 1
        			if(dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) { //dp[i-coins[j]] 代表上个状态的最优解
        			//则更新 dp[i]
        				dp[i] = dp[i-coins[j]] + 1;
        			}
        		}
        	}
        }
        return dp[amount];
 }
发布了24 篇原创文章 · 获赞 3 · 访问量 557

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/103920254