zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",minSize[W][H][M-1]);
        }
        return 0;
    }
  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9167050.html
Copyright © 2011-2022 走看看