[英]'Steal minimum number of items as a thief' problem
我的一位教授問過這個問題;
Imagine a thief entering a house. In the house, there are infinitely many items
that can have only one of three different weights: 1 kg, 3 kgs, and 5 kgs. All of the items are
discrete. The thief has a bag capacity of n kgs and strangely, he wants to steal the “smallest
number of items”.
他希望我們: Show that the greedy choice of taking the largest weight items into the bag first fails to lead to an optimal solution
。 但我聲稱貪婪並不是失敗。 在任何情況下,攜帶多達 5 公斤的物品都會導致物品數量最少,這是最佳的。 他錯了嗎? 我認為貪心是最優的。 有貪心失敗的情況嗎?
順便說一句,我的解決方案:
public int stealRecursive(int bagCapacity) {
return stealRecursive(bagCapacity, 0);
}
private int stealRecursive(int bagCapacity, int numberOfItemsStolen) {
boolean canSteal5kg = bagCapacity - 5 >= 0;
boolean canSteal3kg = bagCapacity - 3 >= 0;
boolean canSteal1kg = bagCapacity - 1 >= 0;
if (canSteal5kg) {
return stealRecursive(bagCapacity - 5, numberOfItemsStolen + 1);
}
if (canSteal3kg) {
return stealRecursive(bagCapacity - 3, numberOfItemsStolen + 1);
}
if (canSteal1kg) {
return stealRecursive(bagCapacity - 1, numberOfItemsStolen + 1);
}
return numberOfItemsStolen;
}
你們中的一些人說放代碼並沒有指向任何地方,你是對的,我只是把它放出來展示我的努力和思維方式。 因為每當我提出問題而不輸入代碼時,我都會被警告先展示我的努力,因為這不是家庭作業網站。 這就是為什么我把我的代碼。 抱歉混淆。
首先,假設你已經“拿走了”盡可能多的 5k 件物品,所以你最終得到
m = capacity mod 5
要偷的物品,你已經偷了 5n 公斤。
案例
5n
在這種情況下,你有 n 件物品,如果你偷了 1k 或 3k 件物品,那么情況會更糟(除了 n = 0,在這種情況下,無論你偷 0 件 5 公斤的物品,0 件物品都沒有關系3 公斤或 0 件 1 公斤)
5n + 1
在這種情況下,你偷了 n 件 5 公斤的物品,你還偷了一件 1 公斤的物品。
在capacity=6的情況下,可以偷5+1公斤或者3+3公斤,結果是一樣的,但是n越大,貪心法的優勢越大。
我們有 5n + 1 + 1
在 capacity = 7 的情況下,我們有 5 + 1 + 1 vs 3 + 3 + 1,但一般來說,貪婪在這里也更好。
5n + 3
這比 5n + 1 + 1 + 1 好得多
5n + 3 + 1
在 9 的情況下,我們有 5 + 3 + 1 vs 3 + 3 + 3,但一般來說,貪心更好
一般來說,貪婪更好,但在某些情況下會出現平局。 原因是有無數的物品可以被盜。 如果分別有 5 公斤、3 公斤和 1 公斤的有限物品,那么我們可以想象這樣的場景
5k 項:1 3k 項:3 1k 項:0
容量:9
現在,如果你拿走 5k 物品,那么你最終會得到 8 的戰利品,而不是 9 的戰利品。但是我們有無限的 5k、3k 和 1k 物品,所以這不是真實的場景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.