我熟悉0-1背包问题,当你从每个项目中获得一定数量的副本时,我可以弄清楚当你使用动态编程给出每个项目的无限副本时如何解决它。我现在正试图手工解决它,所以我对任何特定代码都不感兴趣。例如here是我解决0-1问题的方法。如果我获得每个项目的无限量副本,我该如何修改?
编辑:我知道问题的第二个解决方案包含具有相同总值的项目1,2和3。
答案 0 :(得分:2)
一种可能性是提供合适数量的多项物品。对于项procedure TfrmContactsSelect.colContactSelectedHeaderClick(Sender: TObject);
var
i: Integer;
Index: Integer;
MarkedRecord: variant;
CurrentRecord: variant;
begin
if fMulti = True then
begin
Screen.Cursor := crHourGlass;
fSelected := not fSelected;
Index := grdContactsView1.DataController.FocusedRecordIndex;
MarkedRecord := grdContactsView1.DataController.Values[Index, colContactGuid.ID];
try
for i := 0 to grdContactsView1.DataController.FilteredRecordCount - 1 do
begin
Index := grdContactsView1.DataController.FilteredRecordIndex[i];
CurrentRecord := grdContactsView1.DataController.Values[Index, colContactGuid.ID];
if grdContactsView1.DataController.LocateByKey(CurrentRecord) then
begin
grdContactsView1.DataController.Edit;
grdContactsView1.DataController.SetEditValue(colContactSelected.ID, fSelected, evsText);
grdContactsView1.DataController.Post;
end;
end;
finally
grdContactsView1.DataController.LocateByKey(MarkedRecord);
end;
Screen.Cursor := crDefault;
end;
end;
,最多可以
i
该项目的选择,其中m_i := K / w_i
表示背包容量,K
表示w_i
项目的权重。此外,对于在实例中出现的每个权重值,最多只需要一种项目类型,即相对于权重具有最大利润的项目类型。
同样,可以修改动态程序的评估以反映要采用的不同项目数,而不是仅仅区分i
和0
的选择。