DFS:生日蛋糕

简介: DFS:生日蛋糕

制作一个体积为 nπ 的 m 层生日蛋糕,每层都是一个圆柱体。设从下往上数第 i 层蛋糕是半径 Ri、高度为 Hi 的圆柱。要求 Ri > Ri+1 且 Hi > Hi+1。由于要在蛋糕商抹奶油,所以为了尽可能节约经费,希望蛋糕外表面面积 Q 最小。令 Q = Sπ,对给出的 N 和 M,找出蛋糕的制作方案,使 S 最小。除了 Q 外,以上所有数据皆为正整数。

#include <iostream>
#include <cmath>
using namespace std;
int n,m;
int ans=10000;
int va[20];
void dfs(int u,int v,int s,int r0,int h0) {  //u层,v当前体积,s当前体积,
  if(u==m) {                   //r0半径,h0高度 
    if(v==n){
      if(ans>s){
        ans=s;
      }
    }
    return;
  }
  if(va[m-u]+v>n){
    return;
  }
  if(2.0*(n-v)/r0+s>ans){
    return;
  }
  for(int i=r0;i>=m-u;i--){
    for(int j=h0;j>=m-u;j--){
      int tv=v+i*i*j;
      if(tv>n){
        continue;
      }
      int ts=s+2*i*j;
      if(u==0){
        ts+=i*i;
      }
      dfs(u+1,tv,ts,i-1,j-1);
    }
  } 
}
int main(){
  cin>>n>>m;    //n为体积 ,m层 
  for(int i=1;i<=m;i++){
    va[i]=va[i-1]+i*i*i;
  }
  int r0=sqrt(n)+0.5;
  dfs(0,0,0,r0,n);
  if(ans==10000){
    ans=0;
  }
  cout<<ans;
  return 0; 
}
相关文章
|
4月前
|
算法
DFS算法的实现
DFS算法的实现
70 3
|
6月前
|
C++
|
6月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
6月前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
机器学习/深度学习 人工智能 定位技术
|
C语言 C++
【DFS练习】素数环
【DFS练习】素数环
119 0
|
算法
DFS and BFS
DFS and BFS
53 0
|
定位技术
DFS:踏青
DFS:踏青
|
算法
迭代加深(DFS)
复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
154 0
迭代加深(DFS)