JZOJ 2679. 跨时代
题目
分析
- 数据这么小,应该是个状压
- 然后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 }
为何要逼自己长大,去闯不该闯的荒唐