平方拆分
本题总分:5 分
【问题描述】
将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方
法?
注意交换顺序视为同一种方法,例如 13.13 + 25.25 + 35.35 = 2019 与 13 .13+ 35.35 +25.25 = 2019 视为同一种方法。
这是一道暴搜的题目,爆搜的时候注意一些题目中的限制条件才能做成更好的剪指,注意是两两不同,我们依次考虑每次填写那个数,然后依次向下搜索就可以了,当然可以设置个标记数组,提高效率。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int f[2020][55];
int dfs(int sum,int t)
{
if(sum==0)return 1;
int res=0;
for(int i=t;i*i<=sum;i++)
{
if(f[sum-i*i][i+1]==-1)
f[sum-i*i][i+1]=dfs(sum-i*i,i+1);
res=res+f[sum-i*i][i+1];
}
f[sum][t]=res;
return res;
}
int main()
{
memset(f,-1,sizeof f);
cout<<dfs(2019,1);
return 0;
}