【发布时间】: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 上找到很多关于它的问题;它甚至有自己的标签:-)