POJ 1190 生日蛋糕
2012-07-19 00:36
309 查看
剪枝……
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> const int INF=100000000; int n,m,cnt[50],flag,anss,ans; void dfs(int c,int l,int lastr,int lasth) { int r,h,tmp,minr,minh,i; if(l==0) { if(c==0&&anss>ans) anss=ans; } else{ minr=(tmp=sqrt((c-cnt[l-1])*1.0/l))<lastr?tmp:lastr; for(r=minr;r>=l;r--) { minh=(tmp=(c-cnt[l-1])/(r*r))<lasth?tmp:lasth; for(h=minh;h>=l;h--) { for(tmp=i=0;i<l;i++) tmp+=(r-i)*(r-i)*(h-i); if(tmp<c) continue; if(l==m) { if(r*r<anss) ans=r*r; else continue; } if(cnt[l-1]+r*r*h<=c) { ans+=2*h*r; if(ans<anss) dfs(c-r*r*h,l-1,r-1,h-1); ans-=2*h*r; } } } } } int main() { int i,j,x,y; // freopen("test.txt", "r", stdin); cnt[0]=0; for(i=1;i<20;i++) cnt[i]=cnt[i-1]+i*i*i; while(scanf("%d%d",&n,&m)!=EOF) { anss=INF; if(cnt[m]>n) printf("0\n"); else { dfs(n,m,1000,1000); if(anss==INF) printf("0\n"); else printf("%d\n",anss); } } return 0; }
相关文章推荐
- Poj 1190 生日蛋糕 (DFS 剪枝)
- POJ - 1190 生日蛋糕(深搜+神奇的剪枝)
- POJ1190 生日蛋糕 强大的dfs剪枝!!
- 1190 poj 生日蛋糕
- [POJ 1190] 生日蛋糕
- POJ-1190-生日蛋糕-DFS(深搜)-枚举-多重剪枝
- POJ 1190 生日蛋糕 搜索加剪枝
- POJ1190 生日蛋糕
- POJ 1190 生日蛋糕
- POJ 1190生日蛋糕
- poj 1190 生日蛋糕
- poj1190生日蛋糕
- poj1190 生日蛋糕 dfs
- poj 1190 生日蛋糕
- POJ 1190 生日蛋糕(深搜+剪枝)
- POJ 1190 生日蛋糕
- POJ 1190 生日蛋糕题解
- poj 1190 生日蛋糕
- POJ1190 生日蛋糕 ACM解题报告(DFS回溯+剪枝)
- poj 1190 生日蛋糕