【问题标题】:Dynamic prog. Algo Rectangle Packaging动态编。算法矩形包装
【发布时间】:2015-04-22 10:33:53
【问题描述】:

我有一个作业问题

给定一组 n 个二维矩形。你需要找到一个 矩形子集的最大可能包装。通过包装我们 意味着将一个较小的矩形 Ri 放在一个较大的矩形 Rj 中,如果 尺寸符合这样做。例如,如果有四个 矩形 R1(2,3),R2(2,4),R3(4,5) 和 R4(5,7) 然后是最大的 可能的包装尺寸为 3,即 {R4

我将通过比较尺寸并计算一个矩形是否具有较小的尺寸来解决这个问题,以便将其打包。

现在作为一名学习者,我的问题是由于存在这句话“设计动态规划算法”,必须采取什么不同的方法 对我来说,这句话不会影响我的方法。我的意思是解决这个问题的唯一线索就是我提到的那个。

需要协助。

我使用了以下代码;

package com.example.testing;

import java.util.ArrayList;
import java.util.List;

public class RectangleTest {
    public double height;
    public double width;

    public RectangleTest(double width, double height){
        this.width = width;
        this.height = height;
    }
    public boolean canPutInside(RectangleTest r){
        if (this.width < r.width && this.height < r.height)
            return true;
        else 
            return false;
    }



    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<RectangleTest> rectangles = new ArrayList<RectangleTest>();
        rectangles.add(new RectangleTest(2  , 3 ));
        rectangles.add(new RectangleTest(2  , 4 ));
        rectangles.add(new RectangleTest(4  , 5 ));
        rectangles.add(new RectangleTest(5  , 7 ));
        rectangles.add(new RectangleTest(8  , 3 ));
        rectangles.add(new RectangleTest(26 , 4 ));
        rectangles.add(new RectangleTest(44 , 5 ));
        rectangles.add(new RectangleTest(5  , 1 ));
        rectangles.add(new RectangleTest(2  , 31    ));
        rectangles.add(new RectangleTest(21 , 4 ));
        rectangles.add(new RectangleTest(6  , 51    ));
        rectangles.add(new RectangleTest(7  , 7 ));
        rectangles.add(new RectangleTest(12 , 3 ));
        rectangles.add(new RectangleTest(31 , 4 ));
        rectangles.add(new RectangleTest(4  , 33    ));
        rectangles.add(new RectangleTest(1, 7   ));
        int highestPackaging = 0;

        for(int i = 0 ; i < rectangles.size() - 1 ; i++){
            int count = 1;
            for(int q = i +1 ; q < rectangles.size() ;q++){
                if(rectangles.get(i).canPutInside(rectangles.get(q)))
                {
                    count++;
                }
            }
            if(highestPackaging < count){
                highestPackaging = count;
            }
        }

        System.out.println("Highest packaging size = "+ highestPackaging);
    }

}

【问题讨论】:

  • 你能详细说明你正在尝试的方法吗?这听起来有点贪婪(不确定,没有太多细节),你确定它是最优的吗?
  • 我想我只是得到蛮力..我要检查类似 if(this.height
  • 对我来说,你似乎在做一个贪婪的方法——这对我来说不是最佳选择
  • 我不确定我是否完全理解了这个问题,你能更好地定义输入吗?
  • 大致意思是可以表示为一种递归算法,利用“小问题”的最优解(最优子结构)最优地解决“大问题”,而一些“小问题”是多次生成的次(重叠的子问题)。你的算法应该有这种形式。通常递归/记忆被重写为循环和数组。

标签: java algorithm dynamic-programming


【解决方案1】:

这看起来像是longest path problem 的变体。

假设可以旋转矩形以将它们组合在一起,您可以将每个矩形视为 2D 散点图中的一个点,其中 x (width) ≥ y(身高):

  |                             .        
  |                           .          
  |                         .            
  |                       .    A         
  |                     .                
  |                   .   B           C  
  |                 .         D          
y |               .                      
  |             .   E                    
  |           .            F            G
  |         .          H         I       
  |       .                              
  |     .        J          K            
  |   .    L        M                    
  | .        N         O                 
  +--------------------------------------
                     x

你的任务是在这些点(节点)形成的图中找到最长的路径,受限于链接只能扩展到具有较小 xy 的其他节点的约束 坐标而不绕过任何其他节点。例如,节点A 可以链接到节点BD,但不能链接到节点F,因为D 位于以FA 为边界的矩形中。

将每个节点与代表从该节点延伸的路径的最大深度的数字相关联,并在前进时记住这些值。答案应该很快就会出现。

【讨论】:

  • 嗯,你的回答真的给了我另一种看待这个问题的方式......我用给定的例子做了一些论文工作......所以再次询问......当我要设置约束时并检查每个点的 x 和 y 是否保持最佳状态?或者我的意思是你指出的最佳方式应该是什么。
  • @SSH:它似乎给出了最佳值,但为什么要对这些框进行排序?这不是很有帮助。
猜你喜欢
  • 2011-11-26
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多