题意
给你一个背包体积为n,现在有两种价值的物品,s1表示1号物品的体积,v1为价值s2,v2代表第二种物品。两种物品能够无限拿,问你最大的价值为多少
思路
看到这个很容易想到背包问题,但是longlong类型的数组存不下,所以我们考虑贪心策略。
s2件一号物品和s1件2号物品,两者的体积相同,在体积相同的情况下优先拿价值高的,所以我们进行比较sum1,sum2,如果sum1>=sum2那么就说明优先拿一号物品,我们还知道这种情况下2号物品最多只能拿s1-1件,因为如果二号物品拿s1件的话那么这时候显然拿一号物品的价值更大,因为sum1>=sum2。所以我们能够知道了二号物品的上界,然后枚举二号物品就行了。另外一种情况同理
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n,s1,v1,s2,v2,ans;
int main()
{
int T;scanf("%d",&T);
for(int kace=1;kace<=T;kace++)
{
scanf("%lld%lld%lld%lld%lld",&n,&s1,&v1,&s2,&v2);
ll sum1=v1*s2;
ll sum2=v2*s1;
ll ans=0;
if(sum1>=sum2)
{
ll t=n/s2;
t=min(t,s1-1);
for(ll i=0;i<=t;i++)
{
ll ss1=i*v2;
ll ss2=(n-i*s2)/s1*v1;
ans=max(ans,ss1+ss2);
}
}
else
{
ll t=n/s1;
t=min(t,s2-1);
for(ll i=0;i<=t;i++)
{
ll ss1=i*v1;
ll ss2=(n-i*s1)/s2*v2;
ans=max(ans,ss1+ss2);
}
}
printf("Case #%d: %lld\n",kace,ans);
}
return 0;
}