蓝桥杯之平方拆分

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

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

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

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

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

ACCODE:

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
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};
vector<int>v;
int ans;
int sum;
void dfs(int begin) //begin!!!!
{
	if(sum==2019){
		ans++;
		return;
	}
	else if(sum>2019)return;
	for(int i=begin;i<=44;i++){// i=begin  很重要,同时保证 1、两两不同 2、无序性
		sum+=a[i];
		dfs(i+1);//这个题是i+1,不能重复,那个题能重复是传的i;
		sum-=a[i];
	}
}
int main()
{
	dfs(1);
	cout<<ans<<endl;
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值