动态规划——完美平方

参考文章

http://www.cnblogs.com/pk28/p/5827338.html

题目

给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。

只需要输出最少的个数。

同时,还有一个定理:四方定理:所有自然数至多只要用四个数的平方和就可以表示。

该题可以使用动态规划来解:
给定的整数从1开始增大到n,然后使用一个一维数组来存储给定数需要的平方数的个数。

后一个状态与前一个状态的转换:

//n为给定,m为从1增长到n
//memo[]为备忘录
for(int i = 0; i*i <m; i++)
{
  memo[i]=min(memo[i], memo[m - i*i] + 1)
}

外部一个循环m从1到n,内部的状态转换公式为:
min内部的始终取值最小的,memo[m - i*i] +1 意思为:
+1表示的是 i*i这个平方数所占的一项。
剩下的个数为,之前求出的meme[m - i*i]。

从1到最大的平方数,挨个减尝试,存储最小值。

变形

这个问题可以转换为判断一个数是几个平方数的和。

bool isOne(int n)
{
  int a= sqrt(n);
  return n == a*a;
}

bool isTwo(int n)
{
for(int i = 0; i*i < n;i++)
{
  if(isOne(n - i*i))
  {return true ;}
}
return false;
}

bool isThree(int n)
{
 for(int i = 0; i*i < n ;i++)
  {
    if(isTwo(n  - i*i ))
    {return true;}
  }
  return false;
}

在使用的时候以此从1到3开始调用函数判断。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,453评论 1 42
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • 夜,静静的来, 它告诉每一个沐浴黑暗的姑娘, 该睡了…… 当她躺下, 还未闭上双眼, 黑夜里的凝视让她突兀地思绪万...
    周小锦阅读 249评论 4 5
  • 《孩子学习不用愁》,作者为金色雨林学习能力研究中心创始人林薇。 全书十四章,围绕一个问题——如何培养孩子学习能力?...
    汤垚阅读 281评论 0 1