RE代码:边读入边二进制拆分
#include<iostream>
#include<math.h>
using namespace std;
const int N=10010,M=1010;
int f[M];
int v[N*4],w[N*4];
int hh1,tt1,hh2,tt2,n;
int main()
{
scanf("%d:%d",&hh1,&tt1);
scanf("%d:%d",&hh2,&tt2);
int m=(hh2*60+tt2)-(hh1*60+tt1);
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++)
{
int a,b,s;
scanf("%d%d%d",a,b,s);
if(s==0)s=999999;
int k=1;
while(k<=s)
{
v[++cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
}
if(s>0)
{
v[++cnt]=a*s;
w[cnt]=b*s;
}
}
n=cnt;
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
printf("%d",f[m]);
return 0;
}
AC代码:读入数组存下来以后在调用数组二进制拆分
#include<iostream>
#include<math.h>
using namespace std;
const int N=100010,M=100010;
int f[M];
int v[N*4],w[N*4];
int a[N],b[N],c[N];
int hh1,tt1,hh2,tt2,n;
int main()
{
scanf("%d:%d",&hh1,&tt1);
scanf("%d:%d",&hh2,&tt2);
int m=(hh2*60+tt2)-(hh1*60+tt1);
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
if(c[i]==0)c[i]=999999;
}
for(int i=1;i<=n;i++)
{
int k=1;
while(k<=c[i])
{
v[++cnt]=a[i]*k;
w[cnt]=b[i]*k;
c[i]-=k;
k*=2;
}
if(c[i]>0)
{
v[++cnt]=a[i]*c[i];
w[cnt]=b[i]*c[i];
}
}
n=cnt;
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
printf("%d",f[m]);
return 0;
}
不明白原理求助