RT,我第一遍写的时候是离线操作,结果过不了样例。后来改成离线操作就AC了,附上代码,求大佬查错。
离线操作:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
int cos[100100],val[100100],num[100100];
int f[50010000];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d%d%d",&val[i],&cos[i],&num[i]);
cnt=n;
for(register int i=1;i<=n;++i)
{
int bas=1;
--num[i];
while(num[i])
{
bas*=2;
if(num[i]>=bas)
{
num[i]-=bas;
val[++cnt]=val[i]*bas;
cos[cnt]=cos[i]*bas;
}
else
{
val[++cnt]=val[i]*num[i];
cos[cnt]=val[i]*num[i];
num[i]=0;
}
}
}
for(int i=1;i<=cnt;++i)
for(register int j=m;j>=cos[i];--j)f[j]=max(f[j],f[j-cos[i]]+val[i]);
printf("%d",f[m]);
return 0;
}
在线操作:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
int cos[100100],val[100100];
int f[50010000];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int bas=1;
cos[++cnt]=b*bas;
val[cnt]=a*bas;
--c;
while(c)
{
bas*=2;
++cnt;
if(c>=bas)
{
c-=bas;
val[cnt]=a*bas;
cos[cnt]=b*bas;
}
else
{
val[cnt]=a*c;
cos[cnt]=b*c;
c=0;
}
}
}
for(int i=1;i<=cnt;++i)
for(register int j=m;j>=cos[i];--j)f[j]=max(f[j],f[j-cos[i]]+val[i]);
printf("%d",f[m]);
return 0;
}
(这两种写法难道不是等价的吗!!??)