Итак, я написал рекурсивный алгоритм для решения вопроса о наименьшем числе «монет» определенного набора наименований, доступных для получения данной суммы. Алгоритм, похоже, работает, но поскольку он рекурсивный и вычисляет все возможные варианты, прежде чем выбирать один или другой, у меня возникло трудное время, когда вы можете распечатать используемые купюры. Поэтому я могу рассчитать наименьшее количество монет, которые можно использовать, но не , которые монеты они. Вот код и маленький основной метод, который я использую для его вождения. Также приветствуются любые предложения по оптимизации самого алгоритма.Выявление ошибок в наименованиях, используемых в алгоритме с минимальным изменением
public class DynamicCoinChange {
public static void main(String[] args) {
int[] denoms = {1, 6, 10, 25};
int numCoins = dynamicCoinChange(denoms, 18, 3);
System.out.println(numCoins);
}
public static int dynamicCoinChange(int[] denoms, int amt, int start) {
if (amt == 0 || start < 0) {
return 0;
} else if (amt == 1) {
return 1;
} else if (denoms[start] > amt ||
dynamicCoinChange(denoms, amt, start-1) <
(1 + dynamicCoinChange(denoms, amt-denoms[start], start)) &&
!(dynamicCoinChange(denoms, amt, start-1) == 0)) {
return dynamicCoinChange(denoms, amt, start-1);
} else {
return 1 + dynamicCoinChange(denoms,amt-denoms[start], start);
}
}
}
Нет, это не сработает, потому что мы по существу вычисляем множество * возможных * решений, а затем выбираем один на основе сравнения. Да, я знаю, что это неэффективно. – MassStrike
Если вы удалите вторую половину своего второго-последнего состояния, '|| dynamicCoinChange (denoms, amt, start-1) < (1 + dynamicCoinChange (denoms, amt-denoms [start], start)) && ! (DynamicCoinChange (denoms, amt, start-1) == 0) 'this должен все еще работать нормально. –
У вас есть удаление, начинающееся с '||' или начиная с '&&'? – MassStrike