時間限制:1000 ms | 記憶體限制:65535 kb
難度:4
描述yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?
輸入有多組測試資料
每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。
(1<=k=n<=10000) (1<=wi,vi<=1000000)
輸出輸出使得單位價值的最大值。(保留兩位小數)
樣例輸入
3 2樣例輸出2 25 3
2 1
0.75典型的0-1分數規劃問題,用二分+貪心求解
首先必須知道單位重要的的最大價值的取值範圍,其最小為0,最大不超過單個物品的單位重量的最大價值
證明如下:
假設第i個物品的單位重量的價值最大,則對於任意的第j個物品的有vj/wj
<=vi/wi 即 vi*wj-vj*wi >= 0
則j,i兩個物品的單位重量的價值為(vi+vj)/(wi+wj),
則
vi/wi-(vi+vj)/(wi+wj) = (vi*wj-vj*wi)/(wi*(wi+wj)) >=0即
vi/wi>=(vi+vj)/(wi+wj)故單位重量的的最大價值不超過單個物品的單位重量的最大價值
找到單位重量的的最大價值的範圍既可以用二分搜尋找到滿足條件的值即可
由於(v1+v2+...+vk)/(w1+w2+...+wk) = value
則(v1+v2+...+vk)=value*(w1+w2+...+wk)
二分搜尋時
如果value比單位重量的最大值大,則
(v1+v2+...+vk)-value*(w1+w2+...+wk) < 0 說明所求的值小於value如果value比單位重量的最大值小,則
(v1+v2+...+vk)-value*(w1+w2+...+wk) > 0說明所求值大於value
#include #include#include
#include
#include
using
namespace
std;
struct
good
};vector
goods(10005
);int
n,k;
bool judge(float
value)
float binarysearch(float
maxv)
return
left;
}int
main()
printf(
"%0.2f\n
",binarysearch(maxv));
}}
視窗最大化
1 jframe 視窗最大化,在建構函式中 新增如下 this.setextendedstate jframe.maximized both 2 jinternalframe視窗最大化,需要在新增到jframe的desktoppane之後設定,如下 bookframe.setmaximum true...
視窗的最大化
原來的 15.13 判斷視窗的最大化 最小化狀態並進行控制 mfc中的cwnd類提供了下面兩個函式用於判斷視窗的最大化 最小化狀態,其子類繼承了這些函式 iszoomed 判斷視窗是否處於最大化狀態。isiconic 判斷視窗是否處於最小化狀態。可以使用cwnd showwindow函式設定視窗的顯...
最大化 如何將RPA的價值最大化?
自動化技術讓企業能夠更有效的利用資源,減少由於人為失誤而造成的風險損失。隨著科技的進步,實現自動化的途徑變得更加多樣化。據forrester 自動化技術將在2019年成為引領數位化轉型的前沿技術,幫助重塑商業模式和客戶體驗。但是市面上有那麼多提供自動化技術的產品,究竟選擇哪乙個更合適?尤其是當這些技...