正整数n拆分成几个不同的平方数——DFS&&打表
Posted lfri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正整数n拆分成几个不同的平方数——DFS&&打表相关的知识,希望对你有一定的参考价值。
考虑将正整数n拆分成几个不同的平方数之和,比如30=1^2 + 2^2 + 5^2=1^2 + 2^2 + 3^2 + 4^2,而8不存在这样的拆分。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 1000 + 10; 5 bool vis[maxn]; 6 vector<int>res; 7 8 bool dfs(int n) 9 10 //printf("%d\n", n); 11 if(n == 0) return true; 12 for(int i = 1; i * i <= n;i++) 13 14 if(!vis[i]) 15 16 vis[i] = true; 17 res.push_back(i); 18 if(dfs(n - i*i)) return true; //有一个满足条件的分解即可返回 19 vis[i] = false; 20 res.pop_back(); 21 22 23 return false; 24 25 26 int main() 27 28 int cnt = 0; 29 for(int i = 1; i < 1000;i++) 30 31 memset(vis, 0, sizeof(vis)); 32 if(!dfs(i)) printf("%d %d\n",++cnt, i); 33 34 35 return 0; 36
只有31个数无法分解:2,3,6,7,8,11,12,15,18,19,...,108,112,128,在10^18内只有31个,更大的没有验证。
以上是关于正整数n拆分成几个不同的平方数——DFS&&打表的主要内容,如果未能解决你的问题,请参考以下文章
用java将一个正整数拆分成若干个正整数的和,问有多少种分法?