6047:分蛋糕

描述

有一块矩形大蛋糕,长和宽分别是整数w 、h。现要将其切成m块小蛋糕,每个小蛋糕都必须是矩形、且长和宽均为整数。切蛋糕时,每次切一块蛋糕,将其分成两个矩形蛋糕。请计算:最后得到的m块小蛋糕中,最大的那块蛋糕的面积下限。

假设w= 4, h= 4, m= 4,则下面的切法可使得其中最大蛋糕块的面积最小。

假设w= 4, h= 4, m= 3,则下面的切法会使得其中最大蛋糕块的面积最小:

输入
共有多行,每行表示一个测试案例。每行是三个用空格分开的整数w, h, m ,其中1 ≤ w, h, m ≤ 20 , m ≤ wh. 当 w = h = m = 0 时不需要处理,表示输入结束。
输出
每个测试案例的结果占一行,输出一个整数,表示最大蛋糕块的面积下限。
样例输入
4 4 4
4 4 3
0 0 0
样例输出
4
6

查看

记忆递归型动规

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
using namespace std;
const int INF=0x7f7f7f7f;
int minSize[25][25][25];///在w,h的长方形切m刀最大蛋糕的面积下限
///记忆递归型动规程序
int MinSize(int w,int h,int m)
{
    if(minSize[w][h][m]!=-1)return minSize[w][h][m];
    if(w*h<m+1)minSize[w][h][m]=INF;
    else if(m==0)minSize[w][h][m]=w*h;
    else {
        ///竖着切
        int SV=INF;
        for(int p=1;p<=w-1;p++){
            for(int k=0;k<=m-1;k++){
                int t=max(MinSize(p,h,k),MinSize(w-p,h,m-1-k));
                SV=min(SV,t);
            }
        }
        ///横着切
        int SH=INF;
        for(int p=1;p<=h-1;p++){
            for(int k=0;k<=m-1;k++){
                int t=max(MinSize(w,p,k),MinSize(w,h-p,m-1-k));
                SH=min(SH,t);
            }
        }
        minSize[w][h][m]=min(SV,SH);
    }
    return minSize[w][h][m];
}
int W,H,M;
int main()
{
    freopen("in.txt","r",stdin);
    memset(minSize,0xff,sizeof(minSize));
    while(scanf("%d %d %d",&W,&H,&M)!=EOF){
        if(W==0)break;
        printf("%d\n",MinSize(W,H,M-1));
    }
    return 0;
}

递推型动规

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
using namespace std;
const int INF=0x7f7f7f7f;
int minSize[25][25][25];///在w,h的长方形切m刀最大蛋糕的面积下限
///递推型动规
int W,H,M;
int main()
{
//    freopen("in.txt","r",stdin);
    while(~scanf("%d %d %d",&W,&H,&M)&&W){
        for(int w=1;w<=W;w++){
            for(int h=1;h<=H;h++){
                minSize[w][h][0]=w*h;
                for(int m=w*h;m<=M-1;m++){
                    minSize[w][h][m]=INF;
                }
            }
        }
        for(int w=1;w<=W;w++){
            for(int h=1;h<=H;h++){
                for(int m=1;m<=M-1;m++){
                    ///竖着切
                    int SV=INF;
                    for(int i=1;i<=w-1;i++){
                        for(int j=0;j<=m-1;j++){
                            int t=max(minSize[i][h][j],minSize[w-i][h][m-1-j]);
                            SV=min(SV,t);
                        }
                    }
                    ///横着切
                    int SH=INF;
                    for(int i=1;i<=h-1;i++){
                        for(int j=0;j<=m-1;j++){
                            int t=max(minSize[w][i][j],minSize[w][h-i][m-1-j]);
                            SH=min(SH,t);
                        }
                    }
                    minSize[w][h][m]=min(SV,SH);
                }
            }
        }
        printf("%d\n",minSize[W][H][M-1]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/MalcolmMeng/p/9167050.html

时间: 2024-11-10 19:43:31

6047:分蛋糕的相关文章

CCF - 201703-1 - 分蛋糕

问题描述 试题编号:    201703-1试题名称:    分蛋糕时间限制:    1.0s内存限制:    256.0MB问题描述:    问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋

分蛋糕

问题描述 试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k.

Pie(分蛋糕问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1969 题意: 多组案例.办生日Party,有N个馅饼,有F个朋友,接下来是N个馅饼的半径.然后是分馅饼,注意每个人都要一样大,形状没什么要求,但都要是一整块的,也就是说不能从两个饼中割一小块来凑一块.饼的厚度一致可看为1,所以面积和体积相等.打比方说,面积为10的和6的两块饼,如果每人分到面积为5,则10分两块,6切成5,够分3个人,如果每人6,则只能分2个了!题目要求每人分到的饼尽可能的大! 案例

CCF201703-1 分蛋糕

试题编号:    201703-1试题名称:    分蛋糕时间限制:    1.0s内存限制:    256.0MB问题描述:    问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量

201903-1 分蛋糕

试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k. 请问当小

CCF——分蛋糕(2017-3)

问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k. 请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕. 输入格式 输入的第一行包含了两个整数n, k,意义如上所述. 第二

openjudge6047分蛋糕[DP]

描述 有一块矩形大蛋糕,长和宽分别是整数w .h.现要将其切成m块小蛋糕,每个小蛋糕都必须是矩形.且长和宽均为整数.切蛋糕时,每次切一块蛋糕,将其分成两个矩形蛋糕.请计算:最后得到的m块小蛋糕中,最大的那块蛋糕的面积下限. 假设w= 4, h= 4, m= 4,则下面的切法可使得其中最大蛋糕块的面积最小. 假设w= 4, h= 4, m= 3,则下面的切法会使得其中最大蛋糕块的面积最小: 输入共有多行,每行表示一个测试案例.每行是三个用空格分开的整数w, h, m ,其中1 ≤ w, h, m

CSP201703-1:分蛋糕

引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试,针对计算机软件开发.软件测试.信息管理等领域的专业人士进行能力认证.认证对象是从事或将要从事IT领域专业技术与技术管理人员,以及高校招考研究生的复试对象. 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕

(二分)分蛋糕问题

题意:N种蛋糕,每个半径给出,要分给F+1个人,要求每个人分的体积一样(形状可以不一样),而且每人只能分得一种蛋糕(不能多种蛋糕拼在一起),求每人最大可以分到的体积.输入:33 34 3 31 24510 51 4 2 3 4 5 6 5 4 2输出:25.13273.141650.2655 #include <stdio.h> #include <iostream> #include <math.h> using namespace std; const double