题目:
题意:
有
n
n
n个棍子,要求我们用这些棍子可以拼出的矩形的最大面积
棍子可以不全用
分析:
因为
n
n
n很小,又涉及到方案,我们便开始尝试用状压来表示方案
用
d
f
s
dfs
dfs来枚举棍子是否使用,凭借前面状压表示出来的方案判断是否可行,不断取最大值
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define LL long long
#define LZX ILU
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int x[20],ans=0,n;
int f[245],tf[(1<<17)];
void dfs(int i,int a,int b,int f1,int f2)
{
if(i>n)
{
if(tf[f1]&&tf[f2]) ans=max(ans,a*b/4);
return;
}
dfs(i+1,a,b,f1,f2);
dfs(i+1,a+x[i],b,f1|(1<<(i-1)),f2);
dfs(i+1,a,b+x[i],f1,f2|(1<<(i-1)));
return;
}
int main()
{
n=read();
for(int i=1;i<=n;i++) x[i]=read();
for(int i=1;i<(1<<n);i++)
{
int sum=0;
for(int j=1;j<=n;j++) if((i>>(j-1))&1) sum+=x[j];
if(sum&1) continue;
memset(f,0,sizeof(f));
f[0]=1;
for(int j=1;j<=n;j++)
{
if(!((i>>(j-1))&1)) continue;
for(int k=sum;k>=x[j];k--)
f[k]|=f[k-x[j]];
}
if(f[sum>>1]) tf[i]=1;
}
dfs(1,0,0,0,0);
if(!ans) printf("No Solution"); else cout<<ans;
return 0;
}