当前位置: 首页 > news >正文

牙科医院网站推广方案网站建设实战教程

牙科医院网站推广方案,网站建设实战教程,网站建设岗位说明,哪里专业做网站题目 322. 零钱兑换 中等 相关标签 广度优先搜索 数组 动态规划 给你一个整数数组 coins #xff0c;表示不同面额的硬币#xff1b;以及一个整数 amount #xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组…题目 322. 零钱兑换 中等 相关标签 广度优先搜索   数组   动态规划 给你一个整数数组 coins 表示不同面额的硬币以及一个整数 amount 表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额返回 -1 。 你可以认为每种硬币的数量是无限的。 示例 1 输入coins [1, 2, 5], amount 11输出3解释11 5 5 1 示例 2 输入coins [2], amount 3输出-1 示例 3 输入coins [1], amount 0 输出0提示 1 coins.length 121 coins[i] 231 - 10 amount 104 思路和解题方法 目标和的定义这个问题的目标是计算凑出目标金额所需的最少硬币数量。 动态规划的思路该代码使用了动态规划的思想将原问题拆解为子问题并利用已解决的子问题的解来求解更大规模的问题。 dp 数组的定义代码创建了一个大小为 amount1 的 dp 数组用于保存计算中间状态的结果。dp[i] 表示组成金额 i 所需的最少硬币数量。 初始化将 dp[0] 初始化为 0表示组成金额为 0 不需要任何硬币。其他位置的 dp 数组元素初始化为 INT_MAX表示初始时无法凑出对应的金额。 状态转移方程采用两层循环来遍历物品和背包。外层循环遍历所有可用的硬币面额内层循环遍历目标金额从该硬币面额开始到 amount。这样可以逐步更新 dp 数组计算得到凑出每个目标金额所需的最少硬币数量。 状态转移对于当前的目标金额 j我们检查 dp[j - coins[i]] 是否不是初始值 INT_MAX。如果不是初始值则表示可以通过使用当前硬币面额 coins[i] 得到目标金额 j。我们比较使用当前硬币和不使用当前硬币两种情况下所需的硬币数量并取最小值作为 dp[j] 的解。 返回结果最后我们返回 dp[amount] 的值作为结果。如果 dp[amount] 仍为初始值 INT_MAX表示无法凑出目标金额因此返回 -1。 总结起来这段代码使用动态规划的思想通过构建一个 dp 数组来保存计算中间状态的结果。通过遍历物品和背包并利用已解决子问题的解逐步计算得到组成目标金额所需的最少硬币数量。最终返回 dp[amount] 的值作为结果。 复杂度 时间复杂度: O(n * amount) 时间复杂度 外层循环遍历硬币列表的长度即 coins 的大小所以时间复杂度为 O(n)其中 n 是硬币列表的长度。内层循环遍历目标金额 amount所以时间复杂度为 O(amount)。 综合起来总的时间复杂度为 O(n * amount)。 空间复杂度 O(amount) 空间复杂度 创建了一个大小为 amount1 的 dp 数组所以空间复杂度为 O(amount)。 因此该算法的空间复杂度为 O(amount)。 c 代码 class Solution { public:int coinChange(vectorint coins, int amount) {vectorint dp(amount 1, INT_MAX); // 创建大小为 amount1 的 dp 数组初始值设置为 INT_MAXdp[0] 0; // 对于组成金额为 0 的情况方法数为 0for (int i 0; i coins.size(); i) { // 遍历每个硬币面额物品for (int j coins[i]; j amount; j) { // 遍历每个目标金额背包if (dp[j - coins[i]] ! INT_MAX) { // 如果 dp[j - coins[i]] 不是初始值即存在组合方式dp[j] min(dp[j - coins[i]] 1, dp[j]); // 更新组成金额 j 的最小方法数}}}if (dp[amount] INT_MAX) return -1; // 如果无法组成金额 amount则返回 -1 表示无解return dp[amount]; // 返回组成金额 amount 的最小方法数} };vectorint dp(amount 1, INT_MAX);创建大小为 amount1 的 dp 数组用于保存组成不同金额的最小硬币数。初始值设置为 INT_MAX表示初始状态下无解。dp[0] 0;对于金额为 0 的情况不需要使用任何硬币所以最小硬币数为 0。for (int i 0; i coins.size(); i)外层循环遍历硬币面额物品以便逐个考虑每个硬币的组合方式。for (int j coins[i]; j amount; j)内层循环遍历目标金额背包从当前硬币面额开始直到目标金额 amount。这样可以确保只考虑能够达到的金额。if (dp[j - coins[i]] ! INT_MAX)如果 dp[j - coins[i]] 不是初始值即存在组合方式则进入条件判断。dp[j] min(dp[j - coins[i]] 1, dp[j]);更新组成金额 j 的最小硬币数。在当前硬币面额 coins[i] 的情况下组成金额 j 的最小硬币数为 dp[j - coins[i]] 1 和当前 dp[j] 的较小值。if (dp[amount] INT_MAX) return -1;如果无法组成金额 amount则返回 -1 表示无解。return dp[amount];返回组成金额 amount 的最小硬币数。 Java代码 class Solution {public int coinChange(int[] coins, int amount) {int max Integer.MAX_VALUE;int[] dp new int[amount 1];//初始化dp数组为最大值for (int j 0; j dp.length; j) {dp[j] max;}//当金额为0时需要的硬币数目为0dp[0] 0;for (int i 0; i coins.length; i) {//正序遍历完全背包每个硬币可以选择多次for (int j coins[i]; j amount; j) {//只有dp[j-coins[i]]不是初始最大值时该位才有选择的必要if (dp[j - coins[i]] ! max) {//选择硬币数目最小的情况dp[j] Math.min(dp[j], dp[j - coins[i]] 1);}}}return dp[amount] max ? -1 : dp[amount];} } 觉得有用的话可以点点赞支持一下。 如果愿意的话关注一下。会对你有更多的帮助。 每天都会不定时更新哦  人  。
http://www.tj-hxxt.cn/news/130176.html

相关文章:

  • 花店网站建设量力商务大厦网站建设
  • 网站流量统计表北京建设网经济适用房
  • 教你做兼职的网站百度搜索官方网站
  • 企业营销型网站的内容成都广告公司排行榜
  • 赣州网站制作百度网盘资源搜索引擎搜索
  • 高质量的合肥网站建设建筑模型设计网站建设
  • 中国航空集团建设开发有限公司网站seo点击排名软件营销工具
  • 怎么写网站文案管理系统 网站模板
  • 成都专业网站建设公司上海注册公司扶持政策
  • 纯jsp做的留言板网站网站被k 多久恢复
  • 网站建设j介绍ppt棋牌app开发需要多钱
  • 婚纱网站模板杭州网络公司建网站
  • 网站开发技能证书做同性恋的珠宝网站
  • 网站页面如何设计企业文化墙设计网站推荐
  • 网站开发微信登录流程网站开发需要掌握哪些知识
  • nas做流媒体网站怎样建设手机网站
  • 老外做牛排的视频网站深圳积分商城网站设计
  • 那个网站可以兼职做效果图网站怎样改logo
  • 怎么做让自己的网站微信小程序打不开
  • 网站后台左侧导航折叠效果打不开网页设计工作内容怎么写
  • app开发做网站慧聚创新网站建设
  • 天津平台网站建设费用百度云在线登录
  • 网站页面优化分析清涧县住房和成乡建设局 网站
  • yy陪玩网站怎么做wordpress网页视频
  • 只做网站可以在百度里收到吗copyright wordpress
  • 市场营销网站移动课程播放网站建设多少钱
  • 服装网站建设美丽php网站建设素材
  • 右翼网站淘宝返利网站怎么做的
  • 保定 网站建设软件开发门户网站创新的方式有
  • 做网站如何推广买量网站免费下载软件