1. 程式人生 > >51 nod 1548 歐姆諾姆和糖果(揹包思維暴力寫)@

51 nod 1548 歐姆諾姆和糖果(揹包思維暴力寫)@

一天,歐姆諾諾姆來到了朋友家裡,他發現了許多糖果。有藍色和紅色兩種。他知道每顆紅色糖果重Wr克,每顆藍色糖果重Wb克。吃一顆藍色糖果會給他帶來Hb的歡樂值,吃一顆紅色糖果會給他帶來Hr的歡樂值。

歐姆諾姆最多隻能吃C克的糖果,而且每一顆糖果不能只吃一半。現在他想通過吃藍色和紅色的糖果來獲得最大的歡樂值。

樣例解釋:每一種糖果吃兩顆即可。


Input
單組測試資料。
輸入佔一行有四個整數C,Hr,Hb,Wr,Wb (1≤C,Hr,Hb,Wr,Wb≤10^9).
Output
輸出最大可能獲得的歡樂值。
Input示例
樣例輸入1
10 3 5 2 3
Output示例
樣例輸出1
16

給出兩種物品的價值和重量,給出揹包大小(資料範圍<=10億),因為資料量大要避免超時,因為價值最大的情況一定是全部為價效比高的物品,或者大部分為價效比高

的物品,小部分為價效比低的情況(這種情況是處理:全為價效比高的物品填不滿揹包,但是加上一些價效比低的價值更大)這種情況數量肯定比較小,列舉一下sqrt(n)內的

數量

#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
#include <set>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 50100;
int a[N];

int main()
{
    LL c, h1, h2, w1, w2, ans=0;
    scanf("%lld %lld %lld %lld %lld", &c, &h1, &h2, &w1, &w2);
    for(int i=0;i<sqrt(c*1.0);i++)
    {
        if(i*w1<=c) ans=max(ans,i*h1+(c-i*w1)/w2*h2);
        if(i*w2<=c) ans=max(ans,i*h2+(c-i*w2)/w1*h1);
    }
    printf("%lld\n",ans);
    return 0;

}