http://acm.pku.edu.cn/JudgeOnline/problem?id=1190
Код:
#include<stdio.h>
int bestw = 0x7fffffff;
int mins[21],minv[21];
int n,m;
#define in(a,b) (a<b?a:b)
void dfs(int v,int s,int level,int r,int h)
{
int i,j;
if(level == 0)
{
if(v == n && bestw > s)
bestw = s;
return;
}
if ( v+minv[level-1]>n || s+mins[level-1]>bestw || 2*(n-v)/r+s>=bestw )
return ;
for( i = r-1; i>=level ; i--)
{
if ( level==m )
s=i*i;
int 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(void)
{
int i;
mins[0] = 1;
minv[0] = 0;
for(i=1;i<21;i++)
{
mins[i] = mins[i-1] + 2*i*i;
minv[i] = minv[i-1] + i*i*i;
}
while(scanf("%d%d",&n,&m)==2)
{
bestw = 0x7fffffff;
dfs(0,0,m,n+1,n+1);
if(bestw == 0x7fffffff)
printf("0\n");
else
printf("%d\n",bestw);
}
return 0;
}