poj1190(搜索剪枝)

来源:互联网 发布:武器知乎 编辑:程序博客网 时间:2024/06/07 17:35
#include<cstdio>#include<cstdlib>#include<cmath>#define minn(a,b) (a>b?b:a)using namespace std;long long ans=99999999,n,m,mins[31],minv[31];void dfs(long long de,long long v,long long s,long long h,long long r){long long i,j;if(de==0){if(v==n&&s<ans)ans=s;return;}    if((v+minv[de-1]>n)||(s+mins[de-1]>ans)||(2*(n-v)/r+s>=ans))return;for (i=r-1;i>=de;i--) {if (de==m) s=i*i;int min=minn(h-1,n-v-minv[de-1]);for (j=min;j>=de;j--) dfs(de-1,v+j*i*i,s+2*i*j,j,i);}}int main(){int i;scanf("%d%d",&n,&m);//体积 层数for (i=1;i<=30;i++) {mins[i]=mins[i-1]+i*i*2;minv[i]=minv[i-1]+i*i*i;}dfs(m,0,0,(int)((n-minv[m-1])/(m*m))+2,(int)(sqrt(1.0*(n-minv[m-1])/m))+2);//层数 体积 表面积 高度 半径if (ans<99999999) printf("%lld\n",ans); else printf("0\n");return 0;}

1 0
原创粉丝点击