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

【leetcode279】完全平方数,动态规划解法

原问题:给定一个非负整数n,如果把它视作一些完全平方数的和,那么最少需要多少个完全平方数?

这次学习到一个热心网友的解法:把问题转化兑换零钱问题,然后使用动态规划求解。
比如,给定 n=12, 那么我们可以列举出可能的完全平方数{1,4,9}。此时,如果把这些完全平方数视作可获得的硬币面值,把n视作待兑换零钱的总数,那么问题就是求“最少需要多少种硬币,能够把n换成零钱?如果兑换不成功,那么返回-1.”)

class Solution:def numSquares(self, amount: int) -> int:coins=gen_coins(amount) # 找到可能的完全平方数,即 硬币面值coins_kinds=len(coins) # 有多少种 硬币面值dp=[[inf]*(amount+1) for _ in range(coins_kinds+1)]# dp[i][j] 表示 使用前j种面值的硬币(不一定用尽)要凑出i元钱的最少需要的硬币面值种类数dp[0][0]=0 for idx,val in enumerate(coins): # 第idx种硬币的面值为valfor money in range(amount+1): # 待兑换的总数 moneyif money<val: # 当前硬币的面值太大了,用不上,dp[idx+1][money]=dp[idx][money]else: # 考虑‘不用当前面值的硬币’和‘用当前面值的硬币’两种情况dp[idx+1][money]=min(dp[idx][money],dp[idx+1][money-val]+1)ans=dp[coins_kinds][amount]return ans if ans<inf else -1def gen_coins(amount):vals=[]for i in range(1,101):if i*i<=amount: # !! 注意这里是<=vals.append(i*i)else:breakreturn vals
http://www.lryc.cn/news/333222.html

相关文章:

  • Java 元素排序(数组、List 集合)
  • 使用vite创建一个react18项目
  • 子集(迭代)(leetcode 78)
  • 汽车疲劳测试试验平台技术要求(北重厂家)
  • Redis -- 缓存雪崩问题
  • 【ARM 嵌入式 C 文件操作系列 20 -- 文件删除函数 remove 详细介绍】
  • LeetCode刷题之31.下一个排列
  • 【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(九)- 向量定点算术指令
  • 【Java网络编程】IP网络协议与TCP、UDP网络传输层协议
  • C# 分布式自增ID算法snowflake(雪花算法)
  • commonJS和esModule的应用
  • (十一)RabbitMQ及SpringAMQP
  • STM32 M3内核寄存器概念
  • SQL语句的编写
  • Lecture 1~3 About Filter
  • 配置vscode链接linux
  • 论文阅读——MVDiffusion
  • Linux中的网络命令深度解析与CentOS实践
  • nginx配置实例(反向代理)
  • Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题
  • 云计算存在的安全隐患
  • 黑翅鸢优化算法(BKA)-2024年SCI一区新算法-公式原理详解与性能测评 Matlab代码免费获取
  • sqlmap(四)案例
  • 【C++初阶】String在OJ中的使用(一):仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加
  • 【25考研】:四川大学计算机学院24届874考研考情分析
  • 【GPT-4 Turbo】、功能融合:OpenAI 首个开发者大会回顾
  • java-Stream原理及相关操作详解(filter、map、flatMap、peek、reduce、anyMatch等等)
  • 基于Springboot中小企业设备管理系统设计与实现(论文+源码)_kaic
  • ORACLE 12 C估算 用户历史上的CPU消耗
  • Zookeeper 简明使用教程