童煜智 @ 2018-03-11 12:43:41
using namespace std;
struct jm
{
int v,p,q,x;
}a[100];
int j;
int m,n,f[10000];//这儿!!!
int b[5];
int mmax(int k)
{
int t=0;
for(int i=1;i<=n;i++)
if(a[i].q==a[k].x)
b[++t]=i;
if(t==0) return max(f[j-a[k].v]+a[k].va[k].p,f[j]);
else if(t==1)
{
if(f[j-a[k].v]+a[k].va[k].p>f[j])
return max(f[j-a[k].v]+a[k].va[k].p,f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p);
else return f[j];
}
else if(t==2)
{
if(f[j-a[k].v]+a[k].va[k].p>f[j])
{
int ans=0;
if(ans<f[j-a[k].v]+a[k].va[k].p)
ans=f[j-a[k].v]+a[k].va[k].p;
if(ans<f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p)
ans=f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p;
if(ans<f[j-a[k].v-a[b[2]].v]+a[k].va[k].p+a[b[2]].va[b[2]].p)
ans=f[j-a[k].v-a[b[2]].v]+a[k].va[k].p+a[b[2]].va[b[2]].p;
if(ans<f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p+a[b[2]].va[b[2]].p)
ans=f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p+a[b[2]].va[b[2]].p;
return ans;
}
else return f[j];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].v,&a[i].p,&a[i].q);
a[i].x=i;
}
for(int i=1;i<=m;i++)
if(a[i].q==0)
for(j=n;j>=a[i].v;j--)
f[j]=mmax(i);
printf("%d",f[n]);
return 0;
}
//f数组的大小会影响答案,why? 开小了答案对但RE,开大了答案错
by 单曦增 @ 2018-03-11 13:43:25
@童煜智 程序编译不通过啊
by 童煜智 @ 2018-03-13 16:09:10
using namespace std;
struct jm
{
int v,p,q,x;
}a[100];
int j;
int m,n,f[32010];
int b[5];
int mmax(int k)
{
int t=0;
for(int i=1;i<=n;i++)
if(a[i].q==a[k].x)
b[++t]=i;
if(t==0) return max(f[j-a[k].v]+a[k].va[k].p,f[j]);
else if(t==1)
{
if(f[j-a[k].v]+a[k].va[k].p>f[j])
return max(f[j-a[k].v]+a[k].va[k].p,f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p);
else return f[j];
}
else if(t==2)
{
if(f[j-a[k].v]+a[k].va[k].p>f[j])
{
int ans=0;
if(ans<f[j-a[k].v]+a[k].va[k].p)
ans=f[j-a[k].v]+a[k].va[k].p;
if(ans<f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p)
ans=f[j-a[k].v-a[b[1]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p;
if(ans<f[j-a[k].v-a[b[2]].v]+a[k].va[k].p+a[b[2]].va[b[2]].p)
ans=f[j-a[k].v-a[b[2]].v]+a[k].va[k].p+a[b[2]].va[b[2]].p;
if(ans<f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p+a[b[2]].va[b[2]].p)
ans=f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].va[k].p+a[b[1]].va[b[1]].p+a[b[2]].va[b[2]].p;
return ans;
}
else return f[j];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].v,&a[i].p,&a[i].q);
a[i].x=i;
}
for(int i=1;i<=m;i++)
if(a[i].q==0)
for(j=n;j>=a[i].v;j--)
f[j]=mmax(i);
printf("%d",f[n]);
return 0;
}
by 童煜智 @ 2018-03-13 16:12:37
using namespace std;
struct jm
{
int v,p,q,x;
}a[100];
int j; int m,n,f[32010];
int b[5];
int mmax(int k)
{
int t=0;
for(int i=1;i<=n;i++)
if(a[i].q==a[k].x)
b[++t]=i;
if(t==0) return max(f[j-a[k].v]+a[k].v*a[k].p,f[j]);
else if(t==1)
{
if(f[j-a[k].v]+a[k].v*a[k].p>f[j])
return max(f[j-a[k].v]+a[k].v*a[k].p,f[j-a[k].v-a[b[1]].v]+a[k].v*a[k].p+a[b[1]].v*a[b[1]].p);
else return f[j];
}
else if(t==2)
{
if(f[j-a[k].v]+a[k].v*a[k].p>f[j])
{
int ans=0;
if(ans<f[j-a[k].v]+a[k].v*a[k].p)
ans=f[j-a[k].v]+a[k].v*a[k].p;
if(ans<f[j-a[k].v-a[b[1]].v]+a[k].v*a[k].p+a[b[1]].v*a[b[1]].p)
ans=f[j-a[k].v-a[b[1]].v]+a[k].v*a[k].p+a[b[1]].v*a[b[1]].p;
if(ans<f[j-a[k].v-a[b[2]].v]+a[k].v*a[k].p+a[b[2]].v*a[b[2]].p)
ans=f[j-a[k].v-a[b[2]].v]+a[k].v*a[k].p+a[b[2]].v*a[b[2]].p;
if(ans<f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].v*a[k].p+a[b[1]].v*a[b[1]].p+a[b[2]].v*a[b[2]].p)
ans=f[j-a[k].v-a[b[1]].v-a[b[2]].v]+a[k].v*a[k].p+a[b[1]].v*a[b[1]].p+a[b[2]].v*a[b[2]].p;
return ans;
}
else return f[j];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].v,&a[i].p,&a[i].q);
a[i].x=i;
}
for(int i=1;i<=m;i++)
if(a[i].q==0)
for(j=n;j>=a[i].v;j--)
f[j]=mmax(i);
printf("%d",f[n]);
return 0;
}