细节问题求助
查看原帖
细节问题求助
921623
yuanlai93楼主2023/11/18 21:52

如下是第一份代码,只有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呢?

2023/11/18 21:52
加载中...