摘自 挑戰程式設計競賽
和最大化最小值類似,最大化平均值也可以通過二分法求得。
比如下面這個經典的問題:
有n個物品的重量和價值分別是wi和vi,從中選出k個物品使得單位重量價值最大。
樣例輸入:
3 22 2
5 32 112
34樣例輸出:
0.75
1分析:
一般先想到的是將每個物品的單位重量價值算出來,然後排個序,從大到小貪心進行選擇,可惜這樣是不對的,這樣不能保證最後一定是最大平均值,直接用貪心對於這類要涉及多個因素比如求最大平均值的問題就顯得不那麼正確了。
那麼我們這樣分析這個問題:
令c(x)為可以選擇使得單位重量的價值不小於x。
這樣就可以用二分法來解決,不斷二分x進行判斷,取最大。
我們繼續分析:
∑vi / ∑wi 這個式子是我們需要求的單位重量的價值。
i∈s i∈s12
那麼就求是否滿足:
∑vi / ∑wi >= x
i∈s i∈s12
轉換一下得到:
∑(vi - x*wi) >= 0
i∈s 12
判斷這個式子是否成立即可。這下就可以用乙個陣列來儲存vi - x * wi 的值,並進行排序,從大到小貪心地進行選擇求和,如果求和的值大於0,那麼此時 的x就是成立的。
**如下:
#include#includeview codeusing
namespace
std;
const
int maxn = 10000+10
;const
int inf = 1000000
;int
w[maxn],v[maxn];
double
y[maxn];
intn,k;
bool c(double
d) sort(y, y+n);
double sum = 0
;
for(int i=0; i)
return sum >= 0;}
void
solve()
printf(
"%.2f\n
",lb);
}int
main()
solve();
return0;
}
最大化平均值 二分法
n個物品重量價值分別為wi,vi 取k個值使得單位重量的價值最大。輸入 n k 接下來n行表示重量 接下來n行表示價值 分析 貪心是錯的。使的vi wi最大 假設單位重量的最大價值為x。則vi wi x 即vi wi x 0 所以按照上面公式排序二分求解。include include includ...
二分法求最大化平均值
有n個物品,每個物品分別對應乙個重量和價值。要求選出k個,使得平均每單位重量的價值最大。思路 設k的集合是s 使得平均值最大,即 vs ws 最大。列舉答案x,vs ws x,即 vs ws x 0 成立。二分x即可。include include include include include i...
最大化平均值
有n個物品的重量和價值分別是w i 和v i 從中選出k個物品使得單位重量的價值最大。1 k n 10 4 1 w i v i 10 6 一般想到的是按單位價值對物品排序,然後貪心選取,但是這個方法是錯誤的,對於有樣例不滿足。我們一般用二分搜尋來做 其實這就是乙個01分數規劃 我們定義 條件 c x...