早上好。扣除,直到達到期望值
我目前正在努力弄清楚我有信心的事情很簡單,但事實證明,這是一項任務,實際工作中的一半。
我正在設計一個項目,旨在通過在別處重新放置各種文件來最大程度地降低驅動器使用率。我有一個數組(0..12)int64
值包含我可能想要移動的文件的文件大小。該陣列按預測最大文件大小預測最小文件大小的方式排序。我還獲得了存儲在不同陣列中的這些文件的名稱(稱爲WoWData
,也是[0..12]
)。然後,我得到了「安裝尺寸」和「所需尺寸」。
我的任務是計算我需要移動哪些文件,以便通過遍歷文件大小數組,將「安裝大小」降低到「所需大小」,並將值從「安裝大小」我達到< =所需的大小。
下面是我一直在嘗試使用的一些示例代碼(Delphi/Firemonkey)。我試圖弄清楚如何去完成這樣的任務令人困惑,所以毫無疑問會帶來很多問題。
Global Vars;
_WoWDataFileSize : Array [0..12] of Int64;
// "TBWoWDir" is a TTrackBar (Firemonkey)
var
TotalSize, ReqSize, DiffSize, CurDiff : Int64;
i : Integer;
begin
// Set up initial values to work with
ReqSize := Round(TBWoWDir.Value); // Requested Size
TotalSize := Round(TBWoWDir.Max); // Actual installation size
CurDiff := 0; // Assume as "Current Difference in size"
// Calculate difference between install and requested size
DiffSize := TotalSize - ReqSize; // This calculates correctly
// The below is what i'm struggling with
repeat
for i := Low(_WoWDataFileSize) to High(_WoWDataFileSize) do
begin
CurDiff := ReqSize - _WoWDataFileSize[i];
end;
until CurDiff <= ReqSize;
end;
我曾嘗試只用repeat .. until
迴路中無需for
環,但同樣,我越來越遠太糊塗了,而試圖弄明白。
讓我舉個例子。假設_WoWDataFileSize[0]
爲200,並且_WoWDataFileSize[1]
到_WoWDataFileSize[12]
與它們的數組索引相同(例如_WoWDataFileSize[6]
= 6,_WoWDataFileSize[8]
= 8等)。
,如果我想計算的150值(將根據陣列是200 - 12 - 11 - 10 - 9 - 8
,或Array[0] - Array[12] - Array[11] - Array[10] - Array[9] - Array[8]
),並獲得文件,我需要移動,以滿足從WoWData
陣列這一要求的清單,如何將我寫的例程?
150可以被任何數字替換,因爲我正致力於由TBWoWDir.Value
指定的動態用戶請求大小。
我想我可能需要做一個While
循環,並使用i := i+1
設置。實際上,我可以通過並對其進行硬編碼,以便每次取出數組中的一個值,並檢查每次是否爲< =期望值 - 每個項目爲2-3行(所以總共24-36行),但這樣既維持混亂又不理想。我很想看看它是如何在一個循環中完成的。我通常不會遇到迴路問題,但這對我來說並不是一個標準問題。
聽起來你正在研究解決[bin-packing問題](http://en.wikipedia.org/wiki/Bin_packing_problem)以使文件適合最少數量的安裝介質。示例近似實現在線和常用算法教科書中都很常見。這是一個NP難題,但只有13個文件,運行時間不應該太差。 –