關于在成本和限制不同的 n 個專案之間均勻分配固定點數的有效方法的問題,我有點頭疼。每個專案的成本不會增加。
假設我有 3 件物品:
| 姓名 | 成本 | 限制 |
|---|---|---|
| 一種 | 25 | 220 |
| 乙 | 30 | 20 |
| C | 50 | 60 |
此外,我們得到了固定的 Points: 5000。我想知道每個我可以買多少次。我當前的解決方案運行一個回圈并從積分中扣除成本,直到達到所有限制或積分用完。 http://jsfiddle.net/nasc8rfL/
var points = 5000;
var costA = 25;
var costB = 30;
...
var limitA = 220;
...
var maxA = 0;
while (points > 0){
if (points >= costA && limitA > 0){
points -=costA;
limitA -=1;
maxA =1;
};
if (points >= costB && limitB > 0){
points -=costB;
limitB -=1;
maxB =1;
};
if (points >= costC && limitC > 0){
points -=costC;
limitC -=1;
maxC =1;
};
if((points < costA) and (points < costB) and (points <costC)) break;
}
console.log(maxA,maxB,maxC);
最終它不會停留在 A、B、C 而是可變數量的元素(不超過 20 個),所以我會回圈遍歷每個元素而不是 3 個 IF。
我實際上不必扣除積分,我只需要知道每個專案可以購買多少。我覺得我錯過了一些東西,并且有一種更簡單的方法來確定每個人的數量。
我考慮過根據它們的限制來加權它們,但我的腦袋不想和我一起作業,我現在很困。
另外我是 javascript 的初學者,所以如果你們有一些技巧可以讓顯示的回圈更快或更方便,也許可以使用類似的東西
function func(arr){
arr.forEach(x=>{doSomething();})
我會很高興的。
uj5u.com熱心網友回復:
你的方法還不錯。該演算法可以加快一點
- 將元素保存在串列中,而不僅僅是在外部回圈的每次迭代期間訪問每個元素,而是在達到極限時將其踢出串列
- 不只是每輪購買一件,而是盡可能多地購買,如果你在預算范圍內購買同樣多的每件。
const points = 5000;
const items = [
{name: "A", cost: 25, limit: 220},
{name: "B", cost: 30, limit: 60},
{name: "C", cost: 50, limit: 20},
];
let amounts = Object.fromEntries(items.map(i => [i.name, 0]));
let available = items;
let toSpend = points;
do {
available = available.filter(i => amounts[i.name] < i.limit && i.cost <= toSpend);
const maxAmount = Math.max(1, Math.floor(toSpend / available.reduce((s, i) => s i.cost, 0)));
for (const a of available) {
const amount = Math.min(maxAmount, a.limit - amounts[a.name]);
if (amount * a.cost <= toSpend) {
amounts[a.name] = amount;
toSpend -= amount * a.cost;
} else {
break;
}
}
} while (available.length);
console.log(amounts);
console.log(`Leftover: ${toSpend}`);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/477596.html
標籤:javascript 算法 数学
