生日蛋糕
题意:给你蛋糕的总体积和有几层,且蛋糕满足从低到高一层比一层的面积小,高度低。求最小的外表面积。
思路:因为求外表面积,实际上就是求每一层的侧面积+最底层的上表面积。然后可以算出最小的每层面积,便于剪枝,然后从下往上DFS,不断枚举高度和半径就可以解决问题。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<map> #include<vector> #include<queue> #include<cmath> using namespace std; int n,m; int r[25],h[25]; int V[25],S[25]; const int INF=1e9; int ans=INF; void dfs(int dep,int v,int s) { if(s+S[dep]>ans) return; if(2*(n-v)/r[dep+1]+s>ans) return; if(!dep) { if(v==n) ans=s; return; } for(int i=min((int)sqrt(n-v),r[dep+1]-1);i>=dep;i--) { for(int j=min((n-v)/i/i,h[dep+1]-1);j>=dep;j--) { int t=0; if(dep==m) t=i*i; r[dep]=i; h[dep]=j; dfs(dep-1,v+i*i*j,s+2*i*j+t); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { S[i]=S[i-1]+2*i*i; } r[m+1]=h[m+1]=1e9; dfs(m,0,0); if(ans==INF) ans=0; printf("%d\n",ans); }