为何二维的背包过不了,压成一维就过了
查看原帖
为何二维的背包过不了,压成一维就过了
508129
OIer_Eternity楼主2024/3/1 09:27

二维 30 pts WA

#include <bits/stdc++.h>
using namespace std;
int s,n,m,a[105][105],f[105][20005];
int main(){
    scanf("%d%d%d",&s,&n,&m);
    for (int i=1;i<=s;i++) for (int j=1;j<=n;j++) scanf("%d",&a[j][i]);
    for (int i=1;i<=n;i++) sort(a[i]+1,a[i]+s+1);
    for (int i=1;i<=n;i++)
        for (int j=0;j<=m;j++)
            for (int k=0;k<=s;k++)
                if (2*a[i][k]+1>j) break;
                else f[i][j]=max(f[i][j],f[i-1][j-2*a[i][k]-1]+k*i);
    printf("%d\n",f[n][m]);
    return 0;
}

一维 AC

#include <bits/stdc++.h>
using namespace std;
int s,n,m,a[105][105],f[20005];
int main(){
    scanf("%d%d%d",&s,&n,&m);
    for (int i=1;i<=s;i++) for (int j=1;j<=n;j++) scanf("%d",&a[j][i]);
    for (int i=1;i<=n;i++) sort(a[i]+1,a[i]+s+1);
    for (int i=1;i<=n;i++)
        for (int j=m;j>=0;j--)
            for (int k=0;k<=s;k++)
                if (2*a[i][k]+1>j) break;
                else f[j]=max(f[j],f[j-2*a[i][k]-1]+k*i);
    printf("%d\n",f[m]);
    return 0;
}
2024/3/1 09:27
加载中...