北大poj1190题讨论中的代码,求大神解释
北大poj 1190题目讨论里面的源代码,小弟看不懂,求大神解释下, 尽可能把注解写得详细些#include<stdio.h>
#define in(a,b) (a<b?a:b)
int n,m;
int minv[21],mins[21];
int bests;
void dfs(int v,int s,int level,int r,int h) //这个函数请详细点解释
{
if(level==0)
{
if(v==n && s<bests)
bests=s;
return ;
}
if(v+minv[level-1]>n || s+mins[level-1]>bests || 2*(n-v)/r+s>=bests) //如果把中括号内的level-1都换成level就是32ms
return ;
int i,j,hh;
for(i=r-1;i>=level;i--)
{
if(level==m)
s=i*i;
hh=in((n-v-minv[level-1])/(i*i),h-1);
for(j=hh;j>=level;j--)
dfs(v+i*i*j,s+2*i*j,level-1,i,j);
}
}
int main()
{
int i;
minv[0]=0;
mins[0]=0;
for(i=1;i<=20;i++)
{
minv[i]=minv[i-1]+i*i*i; //为什么要这样赋处值
mins[i]=mins[i-1]+2*i*i;
}
while(scanf("%d%d",&n,&m)==2)
{
bests=0x7fffffff; //为什么要最大
dfs(0,0,m,n+1,n+1);
if(bests==0x7fffffff)
printf("0\n");
else
printf("%d\n",bests);
}
return 0;
}