程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj1190 生日蛋糕 dfs

poj1190 生日蛋糕 dfs

編輯:C++入門知識

 


題意:生日蛋糕有m層,總體積是V。從下向上,每一層的半徑r和高度h都是遞減的。

給m、v,求最小的表面積s。(不算底面接地的面積)

題目鏈接:poj1190

 


剪枝都還沒加。。樣例輸出都是錯的。。。還沒找到問題。。。

 

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;

int ans,V,M,flag,s;

int dfs(int v,int m,int newr,int newh)
{
    int r,h,tmp,i;
    if(m==0)
    {
        flag=1;
        if(v==0&&s<ans) ans=s;
        return 0;
    }
    for(i=1,tmp=0;i<=m;i++)//若之後每層都取最小值
        tmp+=(i*i*i);
    if(tmp>v) return 0;//依然大於剩余的v 那麼一定不可能
    tmp-=(m*m*m);
    for(r=newr;r>=m;r--)
    {
        for(h=newh;h>=m;h--)
        {
            //for(i=0,tmp=0;i<m;i++)//每層取最大值  //這個剪枝加了也有問題
            //    tmp+=(r-i)*(r-i)*(h-i);
            //if(v>tmp) break;//依然小於v 也不可能
            if(m==M) s+=r*(2*h+r);
            else s+=2*r*(h+r);
            if(s<ans) dfs((v-(r*r*h)),m-1,r-1,h-1);
            if(m==M) s-=r*(2*h+r);
            else s-=2*r*(h+r);
        }
    }
    return 0;
}

int main()
{
    while(~scanf("%d%d",&V,&M))
    {
        ans=inf;
        s=0;
        flag=0;
        dfs(V,M,1000,1000);
        printf("%d\n",flag?ans:0);
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved