1. 程式人生 > >01 分數規劃

01 分數規劃

問題 bsp 先來 .... per sigma sea 方案 參數

推薦博客 : http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html

學習這東西源於牛客多校大佬們的一道簽到題....

先來看一個問題

01分數規劃問題:所謂的01分數規劃問題就是指這樣的一類問題,給定兩個數組,a[i]表示選取i的收益,b[i]表示選取i的代價。如果選取i,定義x[i]=1否則x[i]=0。每一個物品只有選或者不選兩種方案,求一個選擇方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i])取得最值,即所有選擇物品的總收益/總代價的值最大或是最小。

問題分析 :

數學分析中一個很重要的方法就是分析目標式,這樣我們來看目標式。

R=sigma(a[i]*x[i])/sigma(b[i]*x[i])

我們來分析一下他有什麽性質可以給我們使用。

我們先定義一個函數F(L):=sigma(a[i]*x[i])-L*sigma(b[i]*x[i]),顯然這只是對目標式的一個簡單的變形。分離參數,得到F(L):=sigma((a[i]-L*b[i])*x[i])。這時我們就會發現,如果L已知的話,a[i]-L*b[i]就是已知的,當然x[i]是未知的。記d[i]=a[i]-L*b[i],那麽F(L):=sigma(d[i]*x[i]),多麽簡潔的式子。我們就對這些東西下手了。

顯然對於上面的式子,當 L 取最大值時, F(L) = 0 , 而當 L 的取值大於最大值時,此時F(L)的值是 < 0 的, 當L取小時, F(L) > 0 ,那麽我們這裏根據這個性質就可以去二分 L 了

然後再去選擇物品,能少選就少選 !

01 分數規劃