時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:4 描述
yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?
輸入
有多組測試資料
每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。
(1<=k=n<=10000) (1<=wi,vi<=1000000)
輸出輸出使得單位價值的最大值。(保留兩位小數)
樣例輸入
3 22 25 3
2 1
樣例輸出
0.75二分搜尋
首先可能會想到直接以每個物品的單位重量的價值排序,但結果是錯的
對於樣例, 如果用剛才的想法做的話,會明顯會選擇(2,2)和(5,3),最後輸出(2+3)/(2+5) = 0.714
但是答案是選擇(2,2),(2,1);最後輸出(2+1)/(2+2) = 0.75
為什麼要這樣選呢?
我們可以假設我們拿到單位價值為x以上可以拿多少件物品,假設為m
那麼就有(wp[i1].v + ... + wp[im].v) / (wp[i1].w + ... + wp[im].w) >= x;
轉化成(wp[i1].v - x * wp[i1].w) + ... + (wp[im].v - x * wp[im].w) >= 0;
if(m>=k)說明如果是拿k件,還可以拿更大的單位價值,否則便只能拿比x小的
二分這個x
#include #include #define eps 1e-7
#define maxn 10005
using namespace std;
struct wp
wp[maxn];
double y[maxn]; //wp[i1].v - x * wp[i1].w,對這個進行排序
int cmp(double a, double b) //大到小
int main()
printf("%.2lf\n", l);
} return 0;
}
NYOJ 914 Yougth的最大化
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...
NYOJ 914 Yougth的最大化
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1 wi,v...
NYOJ 914 Yougth的最大化
題目資訊 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 yougth現在有n個物品的重量和價值分別是wi和vi,你能幫他從中選出k個物品使得單位重量的價值最大嗎?輸入 有多組測試資料 每組測試資料第一行有兩個數n和k,接下來一行有n個數wi和vi。1 k n 10000 1...