考虑将正整数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个,更大的没有验证。
原文地址:https://www.cnblogs.com/lfri/p/11140578.html
时间: 2024-10-09 09:28:43