【算法题】寻找最少完全平方数
来源:互联网 发布:adobe杀人软件 编辑:程序博客网 时间:2024/04/30 02:20
问题:
给出一个正整数n,寻找最少的完全平方数,使他们的和为n
完全平方数:1,4,9,16 …
12 = 4+4+4
13 = 4+9
解法一:动态规划
状态转移方程:F(n) = min{ F(n-ai) + 1 } 其中ai为小于等于n的完全平方数
int a[100005];int func(int n){ if (n <= 0) return -1; for (auto i = 1; i <= n;++i) { a[i] = 99999; } int min_tmp; int tmp; for (auto i = 1; i <= n;++i) { min_tmp = 99999; for (auto j = 1; j*j <= i;++j) { tmp = a[i - j*j] + 1; if (tmp<min_tmp) { min_tmp = tmp; } } a[i] = min_tmp; } return a[n];}
解法二:最短路径算法
问题转化为搜索节点n到节点0的最短路径,当两个节点差值为完全平方数时,节点间存在一条路径,路径长度均为1。
int BFSfunc(int n){ if (n<=0) return -1; queue<pair<int, int>> q; q.push(make_pair(n, 0)); while (!q.empty()) { int num = q.front().first; int step = q.front().second; q.pop(); if (num == 0) { return step; } for (auto i = 1; i*i <= num;++i) { q.push(make_pair(num - i*i, step + 1)); } } return -1;}
改进:使用记录表,避免重复的入队
int BFSfunc(int n){ if (n<=0) return -1; queue<pair<int, int>> q; q.push(make_pair(n, 0)); vector<char> visited(n+1, 0); visited[n] = 1; int tmp; while (!q.empty()) { int num = q.front().first; int step = q.front().second; q.pop(); if (num == 0) { return step; } for (auto i = 1; i*i <= num;++i) { tmp = num - i*i; if (visited[tmp]) { continue; } q.push(make_pair( tmp, step + 1)); visited[tmp] = 1; } } return -1;}
阅读全文
0 0
- 【算法题】寻找最少完全平方数
- 某公司测试题(二)---完全平方数最少
- 【转】判断完全平方数的算法
- 1551 寻找平方数
- 求给定数等于最少的几个完全平方数之和
- 求给定数等于最少的几个完全平方数之和
- P53 第46题 完全平方数
- 关于完全平方数
- 完全平方数
- 完全平方数
- 完全平方数
- 完全平方数问题
- 完全平方数
- 【BZOJ2440】完全平方数
- 完全平方数
- 生物芯片 完全平方数
- 完全平方数
- 完全平方数
- 反射的基本用法大全
- RxJava2.0的使用-1
- 【模板】带修改莫队 (模板题:洛谷P1903数颜色)
- 公众号自定义菜单内网页授权登陆url设置
- Candence16.6画封装时出现异常关机
- 【算法题】寻找最少完全平方数
- LeetCode 45 Jump Game II
- qml初学日记(2)- 基本语法
- Qt+Mysql 图书管理系统设计
- RxJava2.0的使用-2
- 海尔COSMOPlat: 世界智能制造的新坐标
- js删除数组元素,快捷方便,删除对象属性
- 机器学习笔记---决策树
- Android中SQL的使用与详解