rt,我写出了如下代码,应该已经是正解了,但是这份代码 MLE 了,应该主要问题是在 flag 数组上,想请教各位大佬,有没有办法再压缩一下空间?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=71;
const int inf=1e8;
int n,sum;
int flag[maxn][1200][1200];
//int mem[maxn][2105][2105];
//map<int,int>flag[2105][2105];
//map<int,int>mem[2105][2105];
//struct node{
// int h,w;
//}a[maxn];
int h[maxn],w[maxn];
int min3(int a,int b,int c){
return min(a,min(b,c));
}
int max3(int a,int b,int c){
return max(a,max(b,c));
}
//h1_plus_h2
int dp(int i,int w1,int w2){
if(w1<0 || w2<0) return inf;
if(i==0){
if(w1==0 && w2==0)
return 0;
else
return inf;
} else {
if(flag[i][w1][w2]!=0)return flag[i][w1][w2];
int x=dp(i-1,w1,w2);
int y=dp(i-1,w1-w[i],w2);
if(w1==w[i]) y+=h[i];
int z=dp(i-1,w1,w2-w[i]);
if(w2==w[i]) z+=h[i];
int ret=min3(x,y,z);
flag[i][w1][w2]=ret;
// mem[w1][w2][i]=ret;
return ret;
}
}
//bool cmp(node x,node y){
// return x.h>y.h;
//}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>h[i]>>w[i];
sum+=w[i];
}
// sort(a,a+n,cmp);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(h[i]<h[j]){
swap(h[i],h[j]);
swap(w[i],w[j]);
}
}
}
// for(int i=0;i<=n;i++){
// for(int j=0;j<=2101;j++){
// for(int k=0;k<=2101;k++){
// flag[i][j][k]=-1;
// }
// }
// }
ll ans=inf;
for(int w1=sum;w1>0;w1--){
for(int w2=sum-w1;w2>0;w2--){
ll h12=dp(n-1,w1,w2);
int w3=sum-w1-w2;
ans=min(ans,(h12+h[0])*max3(w1,w2,w3));
}
}
cout<<ans<<endl;
return 0;
}