• Greedy:Packets(POJ 1017)


            

                  装箱问题1.0

      题目大意:就是一个工厂制造的产品都是正方形的,有1*1,2*2,3*3,4*4,5*5,6*6,高度都是h,现在要包装这些物品,只能用6*6*h的包装去装,问你怎么装才能使箱子打到最小?

      这一题其实很简单,装箱子问题一般都是贪婪算法,这一题也不例外,那么这一又要怎么贪心呢?其实可以这样,我们可以看到,如果我们装了6,5,4这三个尺寸的物品,那么这个一个箱子肯定只能最大装这三个物品一个,6尺寸箱子没有空余位置,5尺寸的箱子还有11个空位,可以装11个1尺寸的物品,4尺寸的箱子可以再装5个2尺寸的物品。

      但是3尺寸的物品就是有点复杂了,因为我们想尽量让三尺寸的物品装在一个箱子里面(贪婪嘛),我们知道一个箱子最多只能转4个三尺寸物品,如果三尺寸物品刚好为4的倍数,那么我们就可以得到箱子的个数了,如果剩余一个3尺寸物品,那么其中3尺寸箱子中的一个箱子还可以装5个2尺寸物品,如果剩余两个,则有3尺寸物品的箱子还可以装3个2尺寸物品,如果剩余3个,则那个3尺寸箱子还可以装1一个2尺寸物品。

      我们只用把2尺寸的物品装好了,那么接下来的事情就简单了,前面我们在3,4尺寸的物品的时候解决了2尺寸物品的问题的一部分,最后剩下的2尺寸物品则有多少就放多少就可以了,1尺寸的填充剩下的,不够再放

      这一题可以用模拟,不过太慢了,直接用数学去解就很快了

     1 #include <iostream>
     2 #include <functional>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 static int stuff[7];
     8 static int left_3[4] = { 0, 5, 3, 1 };
     9 
    10 void Search(void);
    11 
    12 int main(void)
    13 {
    14     while (1)
    15     {
    16         for (int i = 1; i <= 6; i++)
    17             scanf("%d", &stuff[i]);
    18         if (stuff[1] == 0 && stuff[2] == 0
    19             && stuff[3] == 0 && stuff[4] == 0
    20             && stuff[5] == 0 && stuff[6] == 0)
    21             break;//6个物品为0,直接再见
    22         Search();
    23     }
    24     return 0;
    25 }
    26 
    27 void Search(void)
    28 {
    29     int ans = 0, left_2, left_1;
    30     ans += stuff[6] + stuff[5] + stuff[4] + (stuff[3] + 3) / 4;//654肯定是有多少个加多少个,stuff[3] + 3向上取整
    31 
    32     left_2 = stuff[4] * 5 + left_3[stuff[3] % 4];//如果这些箱子都填满了2*2的箱子
    33 
    34     if (left_2 < stuff[2]) 
    35         ans += (stuff[2] - left_2 + 8) / 9;
    36 
    37     left_1 = 36 * ans - 36 * stuff[6] - 25 * stuff[5] - 16 * stuff[4]
    38         - 9 * stuff[3] - 4 * stuff[2];//在除了1*1的物品填满以后,剩余位置,向上取整
    39 
    40     if (left_1 < stuff[1])
    41         ans += (stuff[1] - left_1 + 35) / 36;//直接计算多出来1的大小,向上取整
    42 
    43     printf("%d
    ", ans);
    44 }

  • 相关阅读:
    php date() 函数
    ajax接收遍历处理json格式数据
    textarea 滚动条属性设置
    $.each()和$(selector).each()
    PhpStorm快捷方式
    asp.net错误记录
    php checkbox 从数据库读取和写入
    php表单中如何获取单选按钮与复选按钮的值(示例)
    php一些单选、复选框的默认选择方法(示例)
    常用正则表达式:手机、电话、邮箱、身份证、IP地址、网址、日期等
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4888804.html
Copyright © 2020-2023  润新知