题目:http://codevs.cn/problem/3269/
分析:一道混合背包的题目
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=200005;
long long int f[Tmax],n,m;
void zeroonepack(long long int v,long long int w)
{
int i;
for(i=m;i>=v;i--)
f[i]=max(f[i],f[i-v]+w);
return;
}
void completepack(long long int v,long long int w)
{
int i;
for(i=v;i<=m;i++)
f[i]=max(f[i],f[i-v]+w);
return;
}
void multiplepack(long long int v,long long int w,long long int num)
{
if(num*v>=m)
{
completepack(v,w);
return;
}
long long int k=1;
while(k<num)
{
zeroonepack(k*v,k*w);
num-=k;
k<<=1;
}
zeroonepack(num*v,num*w);
return;
}
int main()
{
int i;
long long int v,w,num;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&v,&w,&num);
if(num==1) zeroonepack(v,w);
else if(num==-1) completepack(v,w);
else multiplepack(v,w,num);
}
printf("%lld",f[m]);
return 0;
}