【简单搜索02】生日蛋糕

题目来源:


题目大意:

做一个体积为Nπ,M层的蛋糕,要求是下一层的R和H比上一层的大。求在给定的N、M下蛋糕最小的表面积。

做题的时候没饿,写题解的时候饿了……【。


解题思路:

dfs可行性剪枝。

一开始就想到两个简单条件,剩余的体积不够了和目前的面积大于已设定的最小面积。TLE……qaq然后再追加条件剩余的理想最大体积小于实际剩余体积。

碎碎念:说起来一开始在循环里我是先把体积自减面积自加再传递的,一直死循环【。但用两个变量存储差值在传递的时候加减就不会,当时还觉得很神奇明明式子都差不多,后来才惊觉您这是在循环里啊您循环到下一个V和S不就变了吗肯定会死循环啊【。以及蛋糕总上面积就是最底层蛋糕的上面积,咱一开始还又加又减的折腾一半天【智商清零


AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int n, m;
int lowS;

void cake(int nowS, int RM, int HM, int leftV, int leftM)
{
    int r, h, v, a;
    if (leftV<0 || (lowS && nowS>lowS) || m*(RM-1)*(HM-1)*(RM-1)<leftV)
    {
        return;
    }
    if (!leftM)
    {
        if (!leftV && (!lowS || nowS < lowS))
        {
            lowS = nowS;
        }
        return;
    }
    for (r=RM-1;r>=leftM;r--)
    {
        for (h=HM-1;h>=leftM;h--)
        {
            v = r*r*h;
            a = 2*r*h;
            if (leftM==m)
            {
                a += r*r;
            }
            cake(nowS+a,r,h,leftV-v,leftM-1);
        }
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    lowS = 0;
    cake(0,100,1000,n,m);
    printf("%d\n",lowS);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值