【问题标题】:Coded Algorithm for number of ways to cross a room穿过房间的多种方式的编码算法
【发布时间】:2016-01-26 15:38:58
【问题描述】:

我遇到了一个问题,给我一个大小为 n 的房间,我可以采取一些步骤来穿过房间。房间总是整数大小,台阶也是如此。可以多次执行相同的步骤。我的目标是找出在不超过房间大小的情况下穿过房间的所有可能方式。用户输入的一个例子是

5 9 1 3 5

第一个整数 5 是房间的大小,而 9 1 3 5 是我可以采取的可能步骤。函数/算法将返回类似这样的内容

5 //房间大小

1 1 1 1 1

1 1 3

1 3 1

3 1 1

5

从概念上讲,我非常了解正在发生的事情,我注意到该函数似乎从最低值开始并从那里构建。我遇到的问题是从我的脑海中得到这个,进入工作代码,任何提示、指针或代码 sn-ps 将不胜感激!提前感谢任何人都可以提供的任何帮助。

我一直在处理/使用的当前代码

public static void main(String[] args) {
        Scanner Scan = new Scanner(System.in);
        int ArraySize;

        int[] num = new int[100];
        int temp;
        int i, n, j;
        int roomLength;
        System.out.println("Size of Room: ");
        roomLength = Scan.nextInt();
        System.out.println("\nTotal numbers that will be entered: ");
        n = Scan.nextInt();
        System.out.println("\nNumbers:");
        for (i = 0 ; i < n; i++){
            num[i] = Scan.nextInt();
        }
        for (j = 1; j <= n; j++) {
            for (i = 0; i < n-1; i++) {
                temp = num[i];
                num[i] = num[i+1];
                num[i+1] = temp;
                uniqueCombinations(num, n, roomLength);
            }
        }
    }

    public static int uniqueCombinations(int num[], int n, int rl){
        int i;
        int value = 0;
        int placeHolder;
        for (i = 0 ; i < n ; i++){
            value += num[i];
            placeHolder = i;
            if(value == rl){
                for (i = 0 ; i <= placeHolder; i++){
                    System.out.print(num[i]);
                }
                System.out.println("");
                break;
            }
        }
        return 0;
    }

}

示例运行:

房间大小: 10

将输入的总数: 5

数字:1 2 3 4 5

2134

2314

2341

451

451

541

514

1234

我不知道如何解释诸如 1 1 1 1 1 1 1 1 1 1 之类的情况

1 1 1 1 1 1 1 1 2 等等...

【问题讨论】:

  • 我建议您阅读并研究硬币找零问题和解决方案。 en.wikipedia.org/wiki/Change-making_problem
  • 看起来像是蛮力练习。我建议您尝试编写生成所有可能组合的代码。之后,您可以添加限制以绕过所有无效组合,因此结果将是所有有效组合。
  • 你的房间可以变多大? 100? 1000?更大?有多少种不同的步长可供选择?我们可以回去吗?假设房间有 5 长,我们的步数是 4 和 3,那么如果向后移动是可以的,那么 4-3+4 是可能的。
  • 这确实是著名的“硬币找零”或“找零”问题的另一种说法。你会在 Stack Overflow 上找到很多关于它的问题;它甚至有自己的标签:-)

标签: java algorithm


【解决方案1】:

起初我以为我找到了一种使用递归来解决它的简单方法。

快速 FALSE PHP 函数 --

<?php
function print_step($size, $steps, $key)
{
    // get the step value
    $nb = $steps[$key];

    while ($size >= $nb)
    {
        $size = $size - $nb;
        echo $nb.' ';
    }
    if ($size > 0 && $key > 0)
    {
        print_step($size, $steps, $key - 1);
    }
}

$room_size = 5;
$steps = array(4, 9, 1, 3, 5, 2);
$total_steps = count($steps);    

// order steps by lowest value (1, 2, 3, 4, 5, 9)
sort($steps);    

// 1 to size(steps)
for ($i=1; $i <= $total_steps; $i++) {
    // from 9 to 1
    print_step($room_size, $steps, ($total_steps - $i));
    echo '<br>';
}

输出:

5 // 从 9 开始 5 // 从 5 开始 4 1 // 从 4 开始 3 2 // 从 3 开始 2 2 1 // 从 2 开始 1 1 1 1 1 // 从 1 开始

然后您可以删除重复项,但使用此解决方案我无法获得所有组合(例如 2、1、1、1)。

我认为你必须先找到每个步骤的每个组合,然后寻找可能的步骤。

查找等效值的 PHP 代码示例 --

<?php

function find_eq($size, $steps, $key)
{
    $ret = array();
    $nb = $steps[$key];
    while ($size >= $nb)
    {
        $size = $size - $nb;
        $ret[] = $nb;
    }
    if ($size > 0 && $key > 0)
    {
        $ret = array_merge($ret, find_eq($size, $steps, $key - 1));
    }
    return $ret;
}

$steps = array(4, 9, 1, 3, 5, 2);

// order steps by lowest value (1, 3, 4, 5, 9)
sort($steps);    

$tot_eqs = array();

// From 1 to 9
foreach ($steps as $key => $value) {

    $eqs = array();

    // smallest so no equivalent
    if ($key == 0) continue;    

    //find eq from (key - 1) to 0
    for ($i = ($key - 1); $i >= 0 ; $i--) {
        $eqs[] = find_eq($value, $steps, $i);
    }
    $tot_eqs[$value] = $eqs;
}    

var_dump($tot_eqs);
//then find possibles steps and print all equivalent values for each step

输出:

array (size=5)

2 =>
    => [1, 1]

3 =>
    => [2, 1]
    => [1, 1, 1]

4 =>
    => [3, 1]
    => [2, 2]
    => [1, 1, 1, 1]

5 => 
    => [4, 1]
    => [3, 2]
    => [2, 2, 1]
    => [1, 1, 1, 1, 1]

9 =>
    => [5, 4]
    => [4, 4, 1]
    => [3, 3, 3]
    => [2, 2, 2, 2, 1]
    => [1, 1, 1, 1, 1, 1, 1, 1, 1]

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2011-08-26
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2020-11-25
    • 2019-05-22
    • 2020-06-20
    相关资源
    最近更新 更多