【发布时间】:2012-10-17 05:52:24
【问题描述】:
大家早上好。
我目前正在尝试找出一些我相信足够简单但被证明是一项半任务才能真正解决的问题。
我正在开展一个项目,该项目旨在通过将各种文件重新定位到其他地方来最大限度地减少驱动器的使用。我有一个包含int64 值的数组(0..12),其中包含我可能想要移动的文件的文件大小。数组的排序方式是预测的最大文件大小到预测的最小文件大小。我还将这些文件的名称存储在不同的数组中(称为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 设置。实际上,我可以通过并对其进行硬编码,以便一次取出数组中的一个值,并每次检查我是否
【问题讨论】:
-
听起来您正在研究bin-packing problem 的解决方案,以使文件适合最少数量的安装媒体。样本近似实现在在线和介绍性算法教科书中很常见。这是一个NP-hard问题,但只有13个文件,运行时间应该不会太差。