题目:http://codevs.cn/problem/5429/
分析:多重背包题目
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=7005;
long long int n,m,f[Tmax];
void completepack(long long int v,long long int w)
{
long long int i;
for(i=v;i<=m;i++)
f[i]=max(f[i],f[i-v]+w);
return;
}
void zeroonepack(long long int v,long long int w)
{
long long int i;
for(i=m;i>=v;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,c;
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&v,&w,&c);
multiplepack(v,w,c);
}
printf("%lld",f[m]);
return 0;
}