Pastel de cumpleaños POJ-1190 (DFS + poda)

Pastel de cumpleaños POJ-1190

Descripción:
El 17 de julio es el cumpleaños del Sr. W. Para ello, ACM-THU tiene que hacer un pastel de cumpleaños de capas M con un volumen de Nπ, cada capa es un cilindro.
Suponga que la i-ésima capa de torta de abajo hacia arriba (1 <= i <= M) es un cilindro con radio Ri y altura Hi. Cuando i <M, se requiere que Ri> Ri + 1 y Hi> Hi + 1.
Debido a la necesidad de poner crema en el bizcocho, con el fin de ahorrar lo máximo posible, esperamos que el área Q de la superficie exterior del bizcocho (excepto la superficie inferior de la capa inferior) sea la más pequeña.
Deje Q = Sπ
, por favor programe para averiguar el plan de fabricación de pasteles (valores apropiados de Ri y Hi) para los N y M dados, de modo que S sea el más pequeño.
(Excepto Q, todos los datos anteriores son números enteros positivos) La
entrada
tiene dos líneas, la primera línea es N (N <= 10000), lo que significa que el volumen de la torta a hacer es Nπ; la segunda línea es M (M < = 20), indica que el número de capas de la torta es M.
La salida
es solo una línea y es un entero positivo S (si no hay solución, entonces S = 0).
Entrada de muestra

100
2

Salida de muestra

68

Sugerencia
fórmula cilíndrica
Volumen V = πR2H
área lateral A '= 2πRH
área inferior A = πR2 Análisis de la pregunta del
patrocinador
: La búsqueda directa es obviamente poco realista, necesitamos podar, entonces podemos pensar en los siguientes aspectos:

  1:当前面积比最小面积大,可以剪枝

  2:当前面积加上剩下最小面积大于最小面积,可以剪枝

  3:若剩余的体积比做最大的蛋糕的体积还要大,那也可以剪枝了,

el código se muestra a continuación:

#include <stdio.h> 
void DFS(int e,int V,int C,int R,int H);
int n,m,k=0; 
int main()
{
    
    
    scanf("%d%d",&n,&m);
    DFS(m,n,0,100,1000);
    printf("%d",k);
 return 0;
}
void DFS( int e, int V, int C, int R, int H)
{
    
    
	int r,h,v,c;
	if(V<0) 
	{
    
    
		return;
	}
	if(!e) 
	{
    
    
        if(!V&& (C<k||!k)) 
        {
    
    
        	k=C;
		}	
        return;
    }
	if(k&&C>k) 
	{
    
    
		return;
	}
    if(e*(R-1)*(R-1)*(H-1)<V &&e!=m) 
    {
    
    
		return;
	}
    for(r=R-1;r>=e;r--)
    {
    
    
   		for(h=H-1;h>=e;h--)
		{
    
    
    	    c=2*r*h;
			v=r*r*h;
			if((C+((2*V)/r))>k&&k)
        	{
    
     
				continue;
			} 
    	    if(e==m)
    	    {
    
    
   				c+=r*r;
			}
        	DFS(e-1,V-v,C+c,r,h);
    	}
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46703995/article/details/107445197
Recomendado
Clasificación