題意:你最多可以喫C千克的糖, 有兩種糖,每種糖有兩個參數,一個爲重 w ,一個爲歡樂度 h , 如何選擇才能擁有最高的歡樂度, 兩種糖數量不限。
題解:看了半天題解才理解如何做,
分爲兩種枚舉政策涵蓋了所有情況, 時間複雜度爲sqrt(c),神奇的暴力
1。如果兩種糖中重量最大的超過sqrt(c), 那麼該糖最多也只能選擇不超過sqrt(c)個, 直接枚舉該糖個數,記錄最大歡樂度
2。如果兩種糖重量都小於sqrt(c),那麼從性價比來考慮
我們可以買到Wb個a糖果的同時也可以將其換作Wa個b糖果
但是有不等式可以知道明顯我們不會選擇買超過Wb以上的a糖果,而是將其換作Wa的b糖果
有此可以知道我們可以枚舉性價比低的糖果,且我們想到該糖果最大購買數量也是小於Wb的 時間複雜度爲sqrt(c)
因此便有了改枚舉
代碼:
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<cmath>
using namespace std;
void swaap(__int64 &a, __int64 &b)
{
__int64 t;
t = a, a = b, b = t;
}
int main()
{
__int64 c, h[3], w[3];
while(scanf("%I64d", &c) != EOF)
{
scanf("%I64d %I64d %I64d %I64d", &h[1], &h[2], &w[1], &w[2]);
if(w[2] > w[1]) swaap(w[2], w[1]), swaap(h[1], h[2]);
__int64 maxx = -1, sum = 0;
if(w[1] * w[1] >= c)
{
for(int i = 0; i <= c/w[1]; i++)
{
sum = i*h[1];
sum += ((c-i*w[1])/w[2] * h[2]);
if(maxx < sum) maxx = sum;
}
}
else
{
sum = 0;
if(((h[1]*1.0) / w[1]) > ((h[2]*1.0) / w[2])) swaap(h[1], h[2]), swaap(w[1], w[2]);
for(int i = 0; i <= w[2]; i++)
{
sum = i*h[1];
sum += ((c-i*w[1])/w[2] * h[2]);
if(maxx < sum) maxx = sum;
}
}
printf("%I64d\n", maxx);
}
}