Java 二维递归背包

Java 二维递归背包,java,arrays,recursion,2d,knapsack-problem,Java,Arrays,Recursion,2d,Knapsack Problem,假设我们有一个瓷砖阵列,每个瓷砖的大小为n:m,还有一个用作电路板的2d阵列 我想写一个递归函数,如果有可能在电路板中安装所有瓷砖,则返回true,否则返回false(不管电路板是否已填充,只需要使用所有瓷砖) 我试过好几种方法都没有成功 解决方案不一定是最优的。我认为贪婪算法策略可能适合您的需求。我在这里发现了一个递归实现的贪婪算法策略:www.cs.siu.edu/~mcoleman/classwork/cs330bonus/Knapsack.java 我本人还没有深入研究这个解决方案,以判

假设我们有一个瓷砖阵列,每个瓷砖的大小为n:m,还有一个用作电路板的2d阵列

我想写一个递归函数,如果有可能在电路板中安装所有瓷砖,则返回true,否则返回false(不管电路板是否已填充,只需要使用所有瓷砖)


我试过好几种方法都没有成功


解决方案不一定是最优的。

我认为贪婪算法策略可能适合您的需求。我在这里发现了一个递归实现的贪婪算法策略:www.cs.siu.edu/~mcoleman/classwork/cs330bonus/Knapsack.java


我本人还没有深入研究这个解决方案,以判断它是否适合你。但是,我确信您可以选择的一个潜在选项是贪婪算法策略。

您可以使用嵌套for循环遍历2d数组中的每个空间,尝试每个空间

for(int x = 0; x < arraysizex; x++)
{
    for(int y = 0; y < arraysizey; y++)
        if(array[x][y] != filled)
        {
            //do something
        }
}
for(int x=0;x
尝试以下操作。您需要实现各种板实用程序功能,例如返回可能的板位置列表。我假设这对你来说没问题——主要是你感兴趣的递归搜索算法

boolean canFit(List<Tile> tiles, Board board) {
    if (tiles.isEmpty()) {
        return true;
    } else {
        for (Tile tile: tiles) {
            tiles.remove(tile);
            for (Position position: board.possiblePositionsFor(tile)) {
                board.addTile(tile, position);
                if (canFit(tiles, board)) 
                    return true;
                board.removeTile(tile);
            }
            tiles.add(tile);
        }
        return false;
    }
}

使用任何适合的方法-第二种方法效率较低,因为它会创建大量新的瓷砖组和板,但也有点整洁。

如果解决方案不一定是最优的,只需尝试每个瓷砖的每个位置。您对如何使用瓷砖有什么好的建议吗?我一直在试着这么做你到底有什么问题?我刚才给了你一个建议。该算法确实有效。“我尝试了几种方法都没有成功”不是一个合适的描述。你尝试过什么,为什么失败了?我认为你不理解这个问题。我相信磁贴大小不同,因此可能无法放入网格。好的,如果您检查xy坐标是否未填充,请遍历每个磁贴,看看它是否符合if语句中当前的xy坐标。这似乎非常接近,只是一个问题-如果我更改整个磁贴数组,它不会破坏递归运行吗(每次移除一个)在循环上,就像你做的一样?(因为它们都使用相同的瓷砖阵列)
boolean canFit(TileSet tiles, Board board) {
    return tiles.isEmpty() || 
        tiles.stream()
            .flatmap(tile -> board.streamPossiblePositionsFor(tile)
                .filter(pos -> canFit(tiles.remove(tile), board.add(tile, pos))
            .findAny().isPresent();
}