#include <iostream>
using namespace std;
int ans = 0;
int N, M;
void dfs( int m, int leftV, int A, int lastR, int lastH)
{
if( m*(lastR-1)*(lastR-1)*(lastH-1) < leftV && m!=M) return; //剩余体积大于最大可能体积剪枝
if( leftV < 0) {return;}
if( ans && A > ans) return; // 当前面积比最小大剪枝
if( !m) {
if( !leftV && ( A < ans || !ans)) ans = A;
return;
}
for( int r = lastR - 1; r >= m; r--)
for( int h = lastH - 1; h >= m; h--){
int curV = r*r*h;
int curA = 2*r*h;
if( m == M) curA += r*r;
if( A+2*leftV/r > ans && ans) continue; // A+2*left/r > 当前面积加上剩下最小面积大于最小面积剪枝
dfs( m-1, leftV - curV, A+curA, r, h);
}
}
int main()
{
cin >> N >> M;
ans = 0;
dfs( M, N, 0, 100, 1000);
cout << ans << endl;
}
}
<
poj_ 1190 生日蛋糕
最新推荐文章于 2022-11-09 09:35:48 发布
这是一个关于POJ 1190编程题目的解决方案,通过直接搜索并结合剪枝策略实现。文章提到在解决过程中考虑了两种剪枝条件,虽然第三种较难想到,但即使如此,也能成功通过测试。第三种剪枝条件涉及计算到第k层时剩余蛋糕面积与最小需求的关系。
摘要由CSDN通过智能技术生成