Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module.exports = (maxAmount, costs) => {
- const minCost = Math.min(...costs);
- let maxCount = (maxAmount / minCost | 0);
- if (!maxCount) {
- return '';
- }
- maxAmount -= maxCount * minCost;
- costs = costs.map((cost) => cost - minCost);
- let byCost = Array.from({length: costs.length}, (_, i) => i);
- byCost.sort((i, j) => {
- return (costs[i] > costs[j] || (costs[i] === costs[j] && i < j)) ? 1 : -1;
- });
- let maxUniqueCount = 0;
- {
- let amount = maxAmount;
- for (let i of byCost) {
- amount -= costs[i];
- if (amount < 0) {
- break;
- }
- maxUniqueCount++;
- if (maxCount === maxUniqueCount) {
- break;
- }
- }
- }
- const k = byCost[0];
- byCost = byCost.slice(1);
- maxUniqueCount--;
- let counts = Array(costs.length).fill(0);
- counts[k] = maxCount;
- for (let i = costs.length - 1; i >= 0 && maxUniqueCount > 0; i--) if (i !== k && costs[i] <= maxAmount) {
- let amount = maxAmount - costs[i];
- let uniqueCount = maxUniqueCount - 1;
- if (uniqueCount > 0) {
- for (let j of byCost) if (j < i) {
- uniqueCount--;
- amount -= costs[j];
- if (!uniqueCount) {
- break;
- }
- }
- }
- if (amount < 0 || uniqueCount > 0) {
- continue;
- }
- let count = 1;
- if (i > k) {
- count += (amount / costs[i] | 0);
- }
- count = Math.min(count, counts[k] - maxUniqueCount)
- counts[i] += count;
- counts[k] -= count;
- maxAmount -= counts[i] * costs[i];
- maxUniqueCount--;
- }
- let message = [];
- for (let i = costs.length - 1; i >= 0; i--) {
- message = [...message, ...Array(counts[i]).fill(i + 1)];
- }
- return message.join('')
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement