如下是第一份代码,只有4分,WA#3和#6
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
int n,m,gn = -1;
int v[N][N],w[N][N],num[N];
int f[N];
int main()
{
scanf("%d%d", &m, &n);
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
gn = max(gn,c);
v[c][++num[c]] = a;
w[c][num[c]] = b;
}
for(int i=1;i<=gn;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=0;k<num[i];k++)
{
if(v[i][k]<=j)
{
f[j] = max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
}
printf("%d",f[m]);
return 0;
}
如下是第二份代码,AC
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010;
int n,m,gn = -1;
int v[N][N],w[N][N],num[N];
int f[N];
int main()
{
scanf("%d%d", &m, &n);
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
gn = max(gn,c);
v[c][++num[c]] = a;
w[c][num[c]] = b;
}
for(int i=1;i<=gn;i++)
{
for(int j=m;j>=0;j--)
{
for(int k=1;k<=num[i];k++)
{
if(v[i][k]<=j)
{
f[j] = max(f[j],f[j-v[i][k]]+w[i][k]);
}
}
}
}
printf("%d",f[m]);
return 0;
}
两份代码的唯一差别,是在三重循环那里。
第一份代码是
for(int k=0;k<num[i];k++)
第二份是
for(int k=1;k<=num[i];k++)
为什么这一点差异,会导致第一份代码WA#3和#6,第二份代码AC呢?