题目描述
将一个整数 m 分解为 n 个四次方数的和的形式,要求 n 最小。例如,当 m=706 时,因为 706=5x5x5x5+3x3x3x3,所以有n=2。可以证明此时 n 最小。
输入格式
一行,一个整数m。
输出格式
一行,一个整数n。
输入输出样例
输入 #1
706
输出 #1
2
说明/提示
数据范围及约定
- 对于 30% 的数据, m≤5000;
- 对于 100% 的数据,m≤100,000.
源代码
#include <bits/stdc++.h>
using namespace std;
int n=999999,m;
void dfs(int s,int r,int num)
{
if(s==0) //递归边界
{
if(num<n) n=num; //保留n的最小值
return;
}
if(num>n || s<0) return; //递归边界,一是为了节省时间,二是为了防止无限递归
for(int i=int(sqrt(sqrt(m)));i>=r;i--) //从大到小遍历,节省时间
{
s-=i*i*i*i;
dfs(s,i,num+1);
s+=i*i*i*i;
}
}
int main()
{
cin>>m;
dfs(m,1,0);
cout<<n<<endl;
return 0;
}
测试点信息
总结
运用深度优先搜索方法(DFS),
基本框架:
void dfs(需要拆分的数(s),前一次拆分所用的数(r),已经拆分的数的个数(num))
{
if(到达边界)
{
保存n的最小值;
返回;
}
for(所有可能性(r>=i>=sqrt(sqrt(m))))
{
保存结果(减去);
继续递归下一个数(dfs(s,r,num+1));
回溯(加回来);
}
}