Python算法例1 完美平方

news2024/9/23 13:17:41

例1 完美平方

1. 问题描述

给定一个正整数n,找到若干个完全平方数(例如:1,4,9,…),使得它们的和等于n,完全平方数的个数最少。

2.问题示例

给出n=8,返回2,因为8=4+4;给出n=25,返回1,因为25=25。

3.代码实现

可以使用动态规划的思想来解决这个问题,具体步骤如下:

  1. 定义一个长度为n+1的数组dp,dp[i]表示数字i最少可以由几个完全平方数相加得到。

  2. 初始化dp[0]=0,因为0本身就是完全平方数。

  3. 对于每个数字i,从1开始枚举所有小于等于i的完全平方数jj,然后更新dp[i]的值,即dp[i]=min(dp[i], dp[i-jj]+1)。

  4. 最终dp[n]就是答案。

import math

def numSquares(n: int) -> int:
    dp = [float('inf')] * (n+1)
    dp[0] = 0
    for i in range(1, n+1):
        for j in range(1, int(math.sqrt(i))+1):
            dp[i] = min(dp[i], dp[i-j*j]+1)
    return dp[n]

print(numSquares(8))
print(numSquares(25))

 运行结果:

可以使用广度优先搜索(BFS)的方法来解决这个问题。具体步骤如下:

  1. 定义一个队列,将初始状态 (n, 0) 入队,其中 n 表示当前剩余的数字,0 表示当前已经使用的完全平方数的个数。

  2. 进入循环,直到队列为空为止。在每一轮循环中,取出队首元素 (num, count)。

  3. 判断 num 是否为完全平方数,如果是,则返回 count+1,即找到了最少的完全平方数个数。

  4. 否则,对于从 1 开始的每个完全平方数 i^2,计算新的剩余数字 new_num = num - i^2,并将 (new_num, count+1) 入队。

import math
from collections import deque

def numSquares(n: int) -> int:
    queue = deque([(n, 0)])
    visited = set([n])

    while queue:
        num, count = queue.popleft()

        if num == 0:
            return count

        for i in range(1, int(math.sqrt(num)) + 1):
            new_num = num - i*i
            if new_num not in visited:
                queue.append((new_num, count + 1))
                visited.add(new_num)

    return -1  # 如果无法找到完全平方数相加等于 n 的情况

# 测试样例
print(numSquares(8))  # 输出 2
print(numSquares(25))  # 输出 1

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【51单片机】:智能施工电梯系统

项目效果: 基于51单片机的智能施工电梯系统 摘 要 智能施工电梯系统目前广泛应用于人们建筑工程中,为人们施工时上下搬运提供了极大的便利。智能施工电梯系统包括密码开启、超重提示,电梯运作及相关信息显示等等功能,施工电梯为我…

数组中出现次数超过一半的数字整型数组有一个数字出现的次数超过总数的一半,请找出该数字

例如长度为 9 的数组{1,2,3,2,4,2,5,2,2}。 由于 2 出现的次数是 5 次,超过一半,所以结果为2。 算法一: 先排序,然后中间值就是要找的数字 图解: int Cmp_int(const void* vp1, const void* vp2) //定义排序规则 {return * (int*)vp1 - *(int*)vp2; } …

ts | js | 爬虫小公举分享

Curl转Code 快速将curl转为各种语言的代码; 便于提取请求头之类, 或者微改直接使用 https://curlconverter.com/node-axios/ (有点慢, 但是很全)https://www.lddgo.net/convert/curl-to-code (没有axios, 我喜欢用axios) 使用… 抓取地址, 使用浏览器或者其他抓包工具都可, 这…

IP地址在互联网中有哪些作用?

在互联网中,IP地址是一种用于唯一标识网络中设备的地址。IP地址不会与其他网络地址(如MAC地址、URL、域名等)发生冲突,因为它们各自在不同的网络层次上起作用,用于不同的目的。 IP地址(Internet Protocol A…

vue3中常用的新组件

一、Fragment vue2中,组件必须有一个根标签 vue3中,组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中。 优点:减少标签层级。 二、Teleport(传送门) 作用:将组件的 html …

企事业单位/公司电脑文件透明加密保护 | 防泄密软件\系统!

推荐——「天锐绿盾电脑文件防泄密系统」 一款全面的企业/公司数据透明加密防泄密系统,旨在从源头上保障数据的安全和使用安全。 PC访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 它具有以下特点&#xff1a…

小程序 swiper滑动 层叠滑动效果

整个红色区域为可滑动区域&#xff0c;数字1区域为展示区域&#xff0c;数字2为下一个展示模块 <scroll-view class"h_scroll_horizontal" enhanced"ture" bind:touchend"touchEnd" bind:touchstart"touchStart"><view clas…

vs c++ 代码 c2362错误

c 开发调试bug 报错 c2362错误 goto语句的使用错误。 我的使用是这样的&#xff1a; goto __end; int nLen value; gto _end; int pBuffer value2;end:我的 nlen 和 pBuffer 直接初始化了&#xff0c;而 goto 与标签之间有任何初始化的语句都不可以&#xff0c;除非用括号把…

CTF-Crypto-第一天-常见编码and古典密码(入门学习笔记)(详)

文章目录 前言0x1 常见编码0x01 编码0x02 ASCII码0x03 Base系列编码0x04其他编码- URL编码-莫尔斯电码&#xff08;Morse Code&#xff09;-HTML实体编码-其他中的其他... 0x05编码与加密的关系 古典密码凯撒密码简单替换密码维吉尼亚密码栅栏密码其他古典密码替换加密移位加密…

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符&#xff1a;&& , || , &#xff01;4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习&#xff1a;闰年的判断4.5 短路 5. swit…

net::ERR_BLOCKED_BY_ADMINISTRATOR 问题定位与解决

本文基于谷歌浏览器调试手机应用 chrome://inspect/#devices 我有一个非常简单的广告页面&#xff0c;页面中有一张背景图&#xff0c;和一个按钮 他本应该是这样的 但实际上只显示了最下方的按钮&#xff0c;整个图片是空白的 页面仅在小米浏览器不显示背景图片&#xff0c;…

责任链模式应用案例

前几天系统商品折扣功能优化&#xff0c;同事采用了责任链模式重构了代码&#xff0c;现整理如下。 一、概念 责任链模式是为请求创建一个处理者对象的链条&#xff0c;所有处理者&#xff08;除最末端&#xff09;都含有下一个对象的引用从而形成一条处理链&#xff0c;该模…

怎么防止文件夹被删除、复制?

当文件夹中存放重要数据时&#xff0c;我们需要严格保护文件夹的安全&#xff0c;避免文件夹被复制、删除。那么&#xff0c;该怎么防止文件夹被删除、复制呢&#xff1f;下面我们就一起来了解一下。 ​文件夹隐藏 当文件夹被隐藏时&#xff0c;其他人无法发现文件夹&#xff…

Redis两种持久化方案RDB 和 AOF

Redis 作为一种非常流行的内存数据库&#xff0c;通过将数据保存在内存中&#xff0c;Redis 得以拥有极高的读写性能。但是一旦进程退出&#xff0c;Redis 的数据就会全部丢失。 为了解决这个问题&#xff0c;Redis 提供了 RDB 和 AOF 两种持久化方案&#xff0c;将内存中的数据…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 堆积树排序法是选择排序法的改进版&#xff0c;可以减少在选择排序法中的比较次数&#xff0c;进而减少排序…

禾匠旧版对接微信小程序发货系统(发货信息管理 接口)

最近小程序如果是商家交易需要再小程序后台点击一下发货&#xff0c;特别麻烦&#xff0c;但是旧版的禾匠又没有这个功能&#xff0c;所以只能手动增加这个功能&#xff0c;但是每一个版本发货逻辑都不一样&#xff0c;大家只能自己手动去兼容一下&#xff0c;下面只是写了一个…

NewStarCTF2023week4-RSA Variation II

题目提示&#xff1a;"Schmidt Samoa" Schmidt-Samoa密码系统&#xff0c;像rabin加密一样&#xff0c;其安全性基于整数因式分解的难度。但 Rabin 解密时会得到四个解&#xff0c;而 Schmidt-Samor 得到的是唯一解。 N p*p*q&#xff0c;知道c、n、d 上脚本&…

【数据结构初阶】顺序表和链表(1)

顺序表和链表&#xff08;1&#xff09; 1.线性表2.顺序表2.1概念以及结构2.1.1静态顺序表2.1.2动态顺序表3.顺序表的实现3.1初始化内容3.2初始化函数3.3销毁函数3.4打印函数3.5扩容函数3.6尾插3.6尾删函数3.7头插函数3.8头删函数3.9查找函数3.10插入函数3.11删除函数3.12修改函…

Linux msend.pl配置

1.概述 1.1.说明​​​​​ 本文细描述Linux环境下(arm架构x64)基于perl的msend.pl配置,以实现根据msend.pl进行告警事件的发送。 1.2.环境说明 OS Version:RHEL7.6(arm架构x64) Perl Version: v5.16.3 1.3.msend.pl架构图 2.msend.pl配置 2.1.msend.pl配置 前提:以r…

基于机器学习与大数据的糖尿病预测 计算机竞赛

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…