- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下午好,
我目前正在开发一个程序,该程序应该使用回溯算法来找到达到特定金额所需的硬币总数的解决方案。
程序的基本布局是这样的
User is prompted for an amount (ie. 123)
int amount = input.nextInt();
User is prompted for number of coins (ie. 6)
int numCoins = input.nextInt();
User is prompted for coin values (ie. 2, 4, 32, 51, 82)
int[] array = new array[] {2, 4, 32, 51, 82};
根据这些信息,我将开发一种回溯算法来输出解决方案。
我试图查找回溯信息,但没有真正的效果。这一切对我来说似乎都很不清楚我到底应该从算法开始。
感谢任何帮助。
编辑
这是我目前一直在做的事情......目前还没有工作
public class coins
{
public static int[] coinValues;
public static int currentAmount = 0;
public static void main(String[] args)
{
ArrayList<Integer> temp = new ArrayList<>();
Scanner input = new Scanner(System.in);
System.out.println("Please enter the amount: ");
int amount = input.nextInt();
System.out.println("Please enter the number of coins: ");
int numCoins = input.nextInt();
coinValues = new int[numCoins];
for (int i = 0; i < numCoins; i++)
{
System.out.println("Please enter coin value of " + i + " :");
int value = input.nextInt();
coinValues[i] = value;
}
for (int i = 0; i < coinValues.length; i++)
{
System.out.print("Coin Value: " + i + " " + coinValues[i] + "\n");
}
tryThis(temp, amount);
for (int i = 0; i < temp.size(); i++)
{
System.out.println(temp.get(i) + " " + " ");
}
}
public static ArrayList<Integer> tryThis(ArrayList<Integer> list, int amount)
{
if (isValid(list, amount) == false)
{
while (amount > currentAmount && (amount > 0))
{
for (int i = 0; i < coinValues.length; i++)
{
for (int k = coinValues.length - 1; k > 0; k--)
{
list.add(coinValues[k]);
int currentCoin = list.get(i);
if (amount > currentAmount)
{
amount = amount - currentCoin;
System.out.println("Amount: " + amount);
}
tryThis(list, amount);
}
}
}
}
return new ArrayList<>();
}
public static boolean isValid(ArrayList list, int amount)
{
boolean keepGoing = true;
if (amount > currentAmount)
{
return keepGoing = false;
}
else
{
return keepGoing;
}
}
}
问候,迈克
最佳答案
你的基本算法将如下所示:
For a given amount
For each coin type
Add the coin to a set
If the set exceeds the amount, discard that set.
If the set contains more coins than it should, discard the set.
If the set equals the amount, add that set to the set of valid possibilities.
Otherwise run the algorithm on each set you've created.
通过回溯,您通常会保留算法每次迭代中剩余的分配量(因此称为“回溯”,因为您试图找到越来越小的量的解决方案)。例如,假设我正在使用 10 角硬币、5 分镍币和 1 便士寻找 0.07 美元:
I start with empty sets.
I add a dime to one set.
I subtract '10' from my amount.
This is a negative number, so I discard that set: it is invalid.
I add a nickel to another (empty) set.
I subtract '5' from my amount.
This equals 2; so I'll have to keep working on this set.
Now I'm working with sets that already include one nickel.
I add a dime to one set.
I subtract '10' from my amount.
This is a negative number, so I discard that set: it is invalid.
I repeat this with a nickel; I discard this possibility because (2 - 5) is also negative.
I repeat this with a penny; this is valid but I still have 1 left.
I repeat this whole process again with a starting set of one nickel and one penny,
again discarding a dime and nickel,
and finally adding a penny to reach an amount of 0: this is a valid set.
Now I go back to empty sets and repeat starting with a nickel, then pennies.
请注意,该算法应产生多个结果:
[nickel, penny, penny]
[penny, nickel, penny]
[penny, penny, nickel]
[penny, penny, penny, penny, penny, penny, penny]
函数式语言自然适合这种递归工作,但您可以用任何语言复制此算法。
这将是实现代码的示例,不包括重复的优雅修剪:
import java.util.*;
public class Backtrack {
private static List<List<Integer>> findSets(int amount, List<Integer> coinTypes, int numberOfCoins) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
for (Integer coin : coinTypes) {
List<Integer> result = new ArrayList<Integer>();
result.add(coin);
int currentAmount = amount - coin;
if (currentAmount >=0) { //only continue if we haven't overshot
if (currentAmount == 0) {
results.add(result);//this is a valid solution, add it to result set
} else {//still some value to make up
if ((numberOfCoins - 1) > 0){//otherwise we shouldn't recurse
List<List<Integer>> recurseResults = findSets(currentAmount, coinTypes, (numberOfCoins - 1));
for (List<Integer> recurseResult : recurseResults) {//Have to add this layer's coin in to each result
recurseResult.add(coin);
}
results.addAll(recurseResults);
}
}
}
}
return results;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int amount = 7;
List<Integer> coinTypes = new ArrayList<Integer>();
coinTypes.add(Integer.valueOf(1));
coinTypes.add(Integer.valueOf(5));
coinTypes.add(Integer.valueOf(10));
int numberOfCoins = 3;
List<List<Integer>> results = findSets(amount, coinTypes, numberOfCoins);
System.out.println("Number of results: " + results.size());
for (List<Integer> result : results) {
System.out.print("Result: ");
for (Integer coin: result) {
System.out.println(result.toString() + ",");
}
}
}
}
关于Java BackTracking 与硬币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530863/
我正在尝试使用 C 中的 BackTracking 解决以下问题,但我不知道如何从这里继续... 问题是: 克里斯计划去一个有 N 个城市的国家旅行。他将得到一个矩阵 NxN 的帮助,其中单元格 (I
下午好, 我目前正在开发一个程序,该程序应该使用回溯算法来找到达到特定金额所需的硬币总数的解决方案。 程序的基本布局是这样的 User is prompted for an amount (ie. 1
a brute-force algorithm 的实现如果发现一个单元格中放置任何数字 1-9 将是非法移动,则解决数独游戏就会失败。 实现是用 C 语言编写的,棋盘由一个 9x9 数组表示。求解器从
(免责声明:这个问题在 SO 上可能有 20 个不同的版本,但阅读其中大多数版本仍然没有解决我的问题) 大家好,这里是(相对)初学者程序员。所以我一直在尝试构建一个数独回溯器来填补不完整的谜题。即
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
我正在尝试解决 N 皇后问题。您可以在 https://leetcode.com/problems/n-queens/ 中找到问题. 对于回溯,我了解到我们可以用三个关键来解决问题: 做出选择 约束
当我尝试在 javascript 中运行以下代码时,浏览器由于灾难性的回溯而挂起,回溯无限循环可能是因为设计不当的正则表达式。我需要一个替代表达式或一种方法来防止这个问题: string temp =
我正在尝试使用从 http://daringfireball.net/2010/07/improved_regex_for_matching_urls 获得的 URL 匹配正则表达式 (?xi) \b
我正在审查一个测试,并注意到所有格量词实际上在 str.split() 中起作用。所以我写了以下代码: String str = "aaaaab"; if(str.matches("a*+b"))
以下 scala 代码无法按预期工作: import scala.util.parsing.combinator.PackratParsers import scala.util.parsing.co
我正在练习解决递归和回溯练习。我遇到一个问题,要打印列表列表的所有笛卡尔积,其中每个子列表仅包含不同的字符。当然,如果任何一个子列表为空 - 最终产品就是一个空列表。 我立即想到递归\回溯地解决它。我
我有 2 个表:customers 和 customers_history。 每个表中的列: customers.id, customers.email, customers_history.date
我不理解以下示例中 x3 的行为(取自更大的语法)。 当然,语法有点奇怪,但大致实现了 (lal)?()? .当第二组不存在时,默认为 .我不明白为什么要输入 "lal"我得到 defaultcha
python 中的 del 语句在应用于列表时会做一些非常奇怪的事情。它不仅会删除相关列表中的条目,还会“回溯”以删除变量派生自的任何列表中的相同元素。 例如: >>> x [1, 2, 3, 4,
我正在尝试在没有任何第 3 方库的情况下解决 n Queen 问题。所以我只使用普通的 python 数组和循环。这是 nQueen 函数 def nQueenBackTrack(self, row
这可能是一个简单的问题,但这里是......假设我有一些类似的事情: .... step1, step2, step3, ... 我希望每次step3失败回溯时都跳过step2并转到step1,但在前
我最近被分配了一个问题,归结为找到给定矩阵中的最长路径,其中两个单元格相邻,当且仅当相邻值小于当前单元格。我一直在绞尽脑汁试图弄清楚,所以我将非常感谢任何帮助。然而,正如我所说,这是一项家庭作业,因此
编辑 2:要实际证明为什么这仍然很重要,请查看 stackoverflow's own regex-caused outage today (2016-07-20)。 ! 编辑:自从我第一次问这个问题
我使用 regex101 分析了这两个正则表达式.我认为/\S+:/的回溯是对的。但我无法理解这种差异。我错了吗? 最佳答案 这是一个 pcre优化调用 auto-possessification .
我无法在 BackTrack 5 R3 (Linux) 中使用 ACR120U 阅读器,我已经下载了必要的 drivers并安装了它们。 lsusb 显示 ACR 阅读器已连接,但如何使用它,nfc-
我是一名优秀的程序员,十分优秀!