原题: http://codeforces.com/problemset/problem/526/C
题意:
无限个a、b物品,两种物品有容量和价值,现在有一个c大小的背包(c<1e9)。问最大价值
解析:
假设现在全部选则a物品,设此时有 个a,0个b。此时背包剩余大小为 ,当慢慢减少a,增加b,使得背包大小当好为0时,为一种临界状态,达到了lcm。再拿掉一个a,就会变成b那边延伸过来的最大值。
再对b做一次。显然答案在这些点之中。
而这个部分的大小为 ,枚举大者,可以证明:
所以对于两边之间枚举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;
}