自学内容网 自学内容网

随想录算法训练营第四十五天|322.零钱兑换、279.完全平方数

322.零钱兑换

public class Solution {
    public int CoinChange(int[] coins, int amount) {
        int[] dp=new int [amount+1];
        int max=int.MaxValue;
        for(int i=0;i<dp.Length;i++)
        {
            dp[i]=max;
        }
        dp[0]=0;
        for(int i=0;i<coins.Length;i++)
        {
            for(int j=coins[i];j<=amount;j++)
            {
                if(dp[j-coins[i]]!=max)
                {
                    dp[j]=Math.Min(dp[j],dp[j-coins[i]]+1);
                }
            }
        }
        return dp[amount]==max?-1:dp[amount];
    }
}

此题可以采用完全背包来做,因为每个数可以多次使用,同时只考虑方法数所以先物品后背包和先背包后物品均可实现,状态转移方程为Dp[j]=Math.Min(Dp[j],Dp[j-coins[i]]+1),最终返回结果时候看是否为最大值,最大值则说明零钱找不齐,返回-1。

279.完全平方数

public class Solution {
    public int NumSquares(int n) {
        int[]dp=new int[n+1];
        int max=int.MaxValue;
        for(int i=0;i<dp.Length;i++)
        {
            dp[i]=max;
        }
        dp[0]=0;
        for(int i=1;i*i<=n;i++)
        {
            for(int j=i*i;j<=n;j++)
            {
                dp[j]=Math.Min(dp[j-i*i]+1,dp[j]);
            }
        }
        return dp[n];
    }
}

在上一题的基础上将每个Coins[i]改为I*I即可满足题意。


原文地址:https://blog.csdn.net/ShengHuoWeiYang/article/details/136359118

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!