搜索剪枝.
http://poj.org/problem?id=1190
#include<iostream>
#include<cmath>
#define min(a,b) a>b?b:a
#define inf 10e6
using namespace std;
int v,m,ans;
int mins[25],minv[25];
void dfs(int k,int r,int h,int v,int s)
{
int curs,curv,maxh;
if(v<minv[k]) return;
if(s+mins[k]>=ans) return;
if(k==0)
{
if(v==0) ans=min(ans,s);
return;
}
for(int i=r-1;i>=k;i--)
{
int nh =(int)((v-minv[k-1])/(double)(i*i));
if(h-1<nh) maxh=h-1;
else maxh=nh;
for(int j=maxh;j>=k;j--)
{
curs=2*i*j;
curv=i*i*j;
if(2*(v-curv)/i+s+curs>=ans)continue;
if(k==m) curs+=i*i;
dfs(k-1,i,j,v-curv,s+curs);
}
}
}
int main()
{
for(int i=1;i<=20;i++)
{
minv[i]=minv[i-1]+i*i*i;
mins[i]=mins[i-1]+2*i*i;
}
while(cin>>v>>m)
{
int start;
ans=inf;
start = (int)sqrt(v/(double)m)+1;
dfs(m,start,start,v,0);
if(ans==inf) cout<<0<<endl;
else cout<<ans<<endl;
}
return 0;
}