初次写这题,写得不是很完美,请大家不要吐槽~~~~~~
#include <cmath>
#include <cstdio>
const int inf=2147483647;
int minv[21],ri[21],hi[21],n,m ;
int ans ;
int dfs (int n,int v,int s,int maxr,int maxh){
int res;
int i,tr,th,ts;
if(n>m){
if(v==n && s+ri[1]*ri[1]<ans){
ans=s+ri[1]*ri[1];
return 1 ;
}
}
for(ri[n]=maxr-1 ; ri[n]>=m-n+1 ; ri[n]--){
res=2.0*(n-v)/ri[n]+ri[1]*ri[1] ;
if(res+s>=ans)
continue ;
for(hi[n]=maxh-1 ; hi[n]>=m-n+1 ; hi[n]--){
if (v+ri[n]*ri[n]*hi[n]+minv[m-n]>n)
continue ;
tr=ri[n];
th=hi[n];
ts=0;
for(i=n;i<=m;i++){
ts+=tr*tr*th ;
tr--;
th--;
}
if(v+ts<n)
continue ;
dfs(n+1,v+ri[n]*ri[n]*hi[n],s+2*ri[n]*hi[n],ri[n],hi[n]) ;
}
}
return 1 ;
}
int main(){
int tv,tr,th,i,j,k,m,n;
tv=0;
for(i=1;i<21;i++){
tv+=i*i*i;
minv[i]=tv;
}
scanf("%d%d",&n,&m);
ans=inf;
tv=n-minv[m-1];
if(tv>0){
tr=sqrt(1.0*tv/m)+1;
th=1.0*tv/(m*m)+1;
dfs(1,0,0,tr,th);
}
if(ans==inf){
ans=0;
}
printf("%d\n",ans);
return 0;
}