这道题我刚下手就是递归,虽然一次成功但发现时间可能不够,提交果然TLE

分析后发现,如果一次计算后,剩余的值如果比下一次开始最大值的平方的剩余次数倍还大,那就不可能了,
于是剪枝,最后采用了313MS,快了至少2倍多

#include <iostream>
#include 
<string>
#include 
<vector>
#include 
<cmath>
using namespace std;

int count;

void getCount(int current,int start,int times)
{
    
if(times==0return;
    
for (int i=start;i>0;i--)
    
{
         
if (i*i<=current)
         
{
             current
-=i*i;
             
if (current==0)
               count
++;
             
else
             

                 
if (i*i*(times-1)<current)    //重要剪枝,若下次递归的最大值平方的times-1倍还没当前值大则剪枝
                     return;     
                 getCount(current,i,times
-1); 
             }

         current
+=i*i;
         }

    }

}


int main() 
{
    
int n;
    
while (scanf("%d",&n)!=EOF)
    
{
        
if (n==0)
          
break;
        
int start=(int)sqrt((double)n);
        count
=0;
        getCount(n,start,
4);
        printf(
"%d\n",count);
    }

}