一个数n的最少可以由多少个数的平方和组成

 1 bool is_sqrt(int n){
 2     for(int i=1;i<=sqrt(double(n));i++){
 3         if(i*i == n)
 4             return true;
 5     }
 6     return false;
 7 }
 8 int pow_number(int mp){
 9     int* a = new int[mp+1];
10     a[0] = 1;
11     a[1] = 1;
12     if(mp==1) return 1;
13     if(is_sqrt(mp))return 1;
14     //int min = 0x8FFFFFFF;
15     for(int i=2;i<=mp;++i)
16     {
17         if(is_sqrt(i)){
18             a[i]=1;
19             continue;
20         }
21         a[i] = a[1]+a[i-1];
22         for(int j=i-1;j>=i/2;--j){
23             a[i] = a[i]<(a[j]+a[i-j])?a[i]:(a[j]+a[i-j]);
24         }
25     }
26     int temp = a[mp];
27     delete[] a;
28     return temp;
29 }

利用动态规划。

时间: 2024-12-12 17:01:32

一个数n的最少可以由多少个数的平方和组成的相关文章

代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

package com.heima.Coding; /* 判断101-200之间有多少个素数(质数),并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.*/ public class Test { public static void main(String[] args) { int count = 0; for (int i = 100; i < 200; i++) { for (int j = 2; j <=

10.4 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。

有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 看了下上机指导上的答案,感觉自己写的这段代码有点low. //一个数组一个指针 #include <stdio.h> #define N 10 #define M 3 int b[N]; int * p=b; int main(){ void change(int a[N],int m); int a[N]={1,2,3,4,5,6,7,8,9,0};

1-100的连续整数,乱序,重复一个数,丢失一个数,原地找出这两个数

问题描述: 1.比如inp={3,1,2,5,3}丢失了4,有两个3,原地找出这两个数. 2.为了方便起见这个连续数组从1开始: 解决: 1.元素3放在数组inp[3-1]的位置,该位置原来存的是2,再把2存入inp[2-1]…… 状态栏:     {0   -1     }     {0-1-1    }     {-1-1-1    }    {-1-1-1  -1}   {-1-1-1   -1} {3,1,2,5,3}     {3,1,2,5,3}     {3,1,2,5,3}   

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

1-100的连续整数,乱序,丢失两个数,原地找出这两个数

问题描述: 1.比如inp={2,3,6,4,7}丢失了1,5,原地找出这两个数. 2.为了方便讨论这个连续数组从1开始到7截至,数组扩展到7位inp={2,3,6,4,7,0,0}: 解决: 1.利用数组元素值与数组下标关系,遍历整个数组,没有被遍历到的位置则为丢失元素所在位置,具体流程如下: 1.从头开始读数组inp[0]=2,根据值2跳转到数组下标为inp[2-1]的位置,得到inp[2-1]=3: 2.修改状态:这个过程中inp[0]位置跳出过,但未跳入过,用0表示这种状态.修改inp[

使用分治法得到一个数中位元为1的个数

有这么一个问题, 给定一个数(假定32位), 如何得到这个数转为二进制后1的个数? 解: X=(x & 0x55555555)+((x>>1)&0x55555555) X=(x & 0x33333333)+((x>>2)&0x33333333) X=(x & 0x0F0F0F0F)+((x>>4)& 0x0F0F0F0F) X=(x & 0x0000FFFF)+((x>>1)& 0x0000FF

面试题-10亿个数中找出最大的10000个数(top K问题)

一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个.时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中(如果是字符串hash(x)%M).对每个文件,建立大小为10000的小根堆,然后按有序数组的合并合并起来,取出最大的10000个即是答案. top K问题 在大规模数据

51nod 1090 3个数和为0 &amp; 51nod 1267 4个数和为0(标记二分)

题目意思: 3个数的和为0: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 -

有序数组每个数平方后,不同数字的个数?O(n)

此乃一道笔试题,当时的确也出来啦.(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素) 如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小. 因此可以使用两个下标,从两边向中间扫描.将绝对值大的数字删掉,计数即可,并记录刚才删除的数值的绝对值,以免出现多次相同的数据,重复计数的问题. 具体看完整代码: 1 #include <iostream> 2 #include <vector> 3 #include <algorithm&