C. Om Nom and Candies(背包 lcm)

原题: http://codeforces.com/problemset/problem/526/C

题意:

无限个a、b物品,两种物品有容量和价值,现在有一个c大小的背包(c<1e9)。问最大价值

解析:

假设现在全部选则a物品,设此时有 x 1 x_1 个a,0个b。此时背包剩余大小为 c x 1 a c-x_1*a ,当慢慢减少a,增加b,使得背包大小当好为0时,为一种临界状态,达到了lcm。再拿掉一个a,就会变成b那边延伸过来的最大值。

再对b做一次。显然答案在这些点之中。

而这个部分的大小为 c % l c m ( a , b ) c\%lcm(a,b) ,枚举大者,可以证明: ( c % l c m ( a , b ) ) / ( m a x ( a , b ) ) &lt; c (c\%lcm(a,b))/(max(a,b))&lt;\sqrt{c}

所以对于两边之间枚举1e5次即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll c,hr,hb,wr,wb;
    scanf("%lld%lld%lld%lld%lld",&c,&hr,&hb,&wr,&wb);
    ll num,ans=0;
    num=c/wr;
    for(int i=1;i<=100000;i++)
    {
        if(num<0)
            break;
        ans=max(ans,num*hr+(c-num*wr)/wb*hb);
        num--;
    }
    num=c/wb;
    for(int i=1;i<=100000;i++)
    {
        if(num<0)
            break;
        ans=max(ans,num*hb+(c-num*wb)/wr*hr);
        num--;
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/89704168
lcm