2017.10.25 书柜的尺寸 失败总结

来源:互联网 发布:php电商系统 编辑:程序博客网 时间:2024/06/09 17:29

这题只能想到第一步。。

首先题目要求的是最小化两个变量的关系,那就必须转化成一个变量的关系,化动为静

比如:枚举限制因素,枚举所有值,再或者就是贪心

一开始想到枚举限制因素,即枚举三个集合中高度最大的数,但剩下的是分配问题,不太好dp TLE

然后就是贪心排序,,然后每个物品一定被选在一个背包里,这样先进入的一定是最大的,

然后直接在每个对应厚度中取当前高度答案最小的。。感觉是生造的dp



码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int k,f[2][2200][2200],i,j,n,m,now,sum[90];long long ans=100000000000009;struct la{int x,y;}a[99];bool cmp(la a,la b){return a.x>b.x;}int main(){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d%d",&a[i].x,&a[i].y);}sort(a+1,a+1+n,cmp);for(i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].y;for(i=1;i<=n;i++,now^=1){//cout<<endl<<i<<" "<<a[i].x<<" "<<a[i].y<<endl;for(k=0;k<=sum[n];k++)for(j=0;j<=sum[n];j++){f[now][k][j]=1000000009;//if(f[now^1][j][k]<1000000009&&f[now^1][j][k]!=0)//cout<<j<<" "<<k<<" "<<f[now^1][j][k]<<endl;    }for(j=0;j<=sum[i-1];j++)for(k=0;k<=sum[i-1];k++)  {f[now][j+a[i].y][k]=min(f[now][j+a[i].y][k],f[now^1][j][k]+(j==0)*a[i].x);f[now][j][k+a[i].y]=min(f[now][j][k+a[i].y],f[now^1][j][k]+(k==0)*a[i].x);        f[now][j][k]=min(f[now][j][k],f[now^1][j][k]+(j+k==sum[i-1])*a[i].x);  }}for(i=1;i<sum[n];i++)for(j=1;j<sum[n];j++){if(sum[n]-i-j>0)ans=min(1ll*f[now^1][i][j]*1ll*(max(sum[n]-i-j,max(i,j))),ans);}printf("%lld",ans);}