Показать сообщение отдельно
  #1 (permalink)  
Старый 15.05.2016, 01:16
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Алгоритм размена монет
Нужно написать прогу которая считает сколькими способами можно разменяь какуе то квоту. Есть квота, есть монеты для размена и их количество, сделать нужно через backtracking .
то что я придумал выглядит примерно так, например есть
10(стоимсть монеты) 5 (количество)
7 3
8 3
1 7
с этого строю матрицу
var values = [
	[ 0, 10, 20, 30, 40, 50 ],
  [0, 7, 14, 21],
  [0, 8, 16, 24],
  [0, 1, 2, 3, 4, 5, 6, 7]
];


выглядит это примерно так

var count = (values, y, coinValue) => {
	if(y >= values.length)
  	return 0;
    
    var res = 0;
    
    for(var i = 0; i < values.length; i++) {
    	var v = coinValue - values[y][i];
      if(v === 0)
      	res++
      else if( v > 0) {
      		res+= count(values, y + 1, v);
      }
      else {
      	break;
      }
    }
    
    return res;
}

var values = [
	[ 0, 10, 20, 30, 40, 50 ],
  [0, 7, 14, 21],
  [0, 8, 16, 24],
  [0, 1, 2, 3, 4, 5, 6, 7]
];
var coinChangeValue = 55;
var res = 0;
for (var i = 0; i < values[0].length; i++) {
       var val = coinChangeValue - values[0][i];
       res += count(values, 1, val);
}

console.log(res);

Мне нужно как то оптимизировать сам алгоритм, потому что он слишком долго работает для больших чисел, гугли разные варианты, но как то не особо идет.
Может ктото подкинет идейку

какие то мелкие оптимизации не имею смысла код переписан с С++, я не могу оригинальный код вкинуть потому что система поиска плагиата меня отмыеет потом)) (это для универа).
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием