多重背包板子题。
我要重新练dp了,好特么菜。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int d[55000],n,m;
void zeroonepack(int w,int p)
{
for(int i=m;i>=w;i--)
if(d[i]<d[i-w]+p) d[i]=d[i-w]+p;
}
void completepack(int w,int p)
{
for(int i=w;i<=m;i++)
if(d[i]<d[i-w]+p) d[i]=d[i-w]+p;
}
void multipack(int w,int p,int c)
{
if(w*c>=m) completepack(w,p);
else
{
int k=1;
while(k<c)
{
zeroonepack(k*w,k*p);
c-=k;
k*=2;
}
zeroonepack(c*w,c*p);
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
{
int w,p,c;
scanf("%d%d%d",&w,&p,&c);
multipack(w,p,c);
}
cout<<d[m]<<endl;
}
}