当前位置:   article > 正文

蓝桥杯之平方拆分_c++蓝桥杯 平方拆分

c++蓝桥杯 平方拆分

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

将 20192019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方法?

注意交换顺序视为同一种方法,例如 13^2 + 25^2 + 35^2 = 2019132+252+352=2019 与 13^2 + 35^2 +25^2 = 2019132+352+252=2019 视为同一种方法。

题解:一看就是DFS,但是难点就是怎么两两不同无序性。

这个题和整数分解为若干项之和有异曲同工之妙,要在函数中设置一个begin,循环的时候就可以避免重复和保证无序性。

ACCODE:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define inf 0x3f3f3f3f
  4. typedef long long ll;
  5. int a[50]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936};
  6. vector<int>v;
  7. int ans;
  8. int sum;
  9. void dfs(int begin) //begin!!!!
  10. {
  11. if(sum==2019){
  12. ans++;
  13. return;
  14. }
  15. else if(sum>2019)return;
  16. for(int i=begin;i<=44;i++){// i=begin 很重要,同时保证 1、两两不同 2、无序性
  17. sum+=a[i];
  18. dfs(i+1);//这个题是i+1,不能重复,那个题能重复是传的i;
  19. sum-=a[i];
  20. }
  21. }
  22. int main()
  23. {
  24. dfs(1);
  25. cout<<ans<<endl;
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48384
推荐阅读
相关标签
  

闽ICP备14008679号