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;
}