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