题目
分析
- 数据这么小,应该是个状压
- 然后dfs
- 我们只用先处理出集合是否能构成长宽
代码
1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 int f[2000],g[1<<17],t[20],n;
5 void dp(int sum,int x)
6 {
7 if (sum&1) return;
8 memset(f,0,sizeof(f)),f[0]=1;
9 for (int i=0;i<n;i++) if (x&1<<i) for (int j=sum;j>=t[i];j--) if (f[j-t[i]]) f[j]=1;
10 if (f[sum>>1]) g[x]=1;
11 }
12 int ans;
13 void dfs(int k,int x1,int sum1,int x2,int sum2)
14 {
15 if (k==n)
16 {
17 if (g[x1]&&g[x2]) ans=max(ans,sum1*sum2/4);
18 return;
19 }
20 dfs(k+1,x1,sum1,x2,sum2),dfs(k+1,x1+(1<<k),sum1+t[k],x2,sum2),dfs(k+1,x1,sum1,x2+(1<<k),sum2+t[k]);
21 }
22 int main ()
23 {
24 cin>>n;
25 for (int i=0;i<n;i++)
26 cin>>t[i];
27 int sum=0;
28 for (int i=1;i<=(1<<n)-1;i++)
29 {
30 sum=0;
31 for (int j=0;j<n;j++) if (i&1<<j) sum+=t[j];
32 dp(sum,i);
33 }
34 dfs(0,0,0,0,0);
35 if (ans)
36 cout<<ans;
37 else
38 cout<<"No Solution";
39 }