Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:直接暴力枚举,状态数 6!*5!==720*120==O(7*10^4)In Reply To:直接暴力枚举,状态数 6!*5!==720*120==O(7*10^4) Posted by:tasty at 2012-08-23 23:29:28 > rt 贴代码 Source Code Problem: 2743 User: tasty Memory: 1292K Time: 16MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<stdio.h> using namespace std; double r,w[10],value[64],ans; int n; struct pp { double l1,l2; }; pp adj[64][720*120]; bool vis[64]; int num[64]; void dfs(int state) { int i,j,s,p,q; double l1,l2; bool have=false; if(vis[state]) return; vis[state]=true; for(i=(state&(state-1));i>0;i=((i-1)&state)) { j=state^i; dfs(i); dfs(j); for(s=0;s<num[i];s++) for(p=0;p<num[j];p++) { l1=value[j]/(value[i]+value[j]); l2=value[i]/(value[i]+value[j]); adj[state][num[state]].l1=max(adj[i][s].l1+l1,adj[j][p].l1-l2); adj[state][num[state]].l2=max(adj[i][s].l2-l1,adj[j][p].l2+l2); if(adj[state][num[state]].l1+adj[state][num[state]].l2<=r) num[state]++; } have=true; } if(!have) { adj[state][num[state]].l1=0; adj[state][num[state]++].l2=0; } } int main() { int t,i,j,s,p,q; scanf("%d",&t); while(t--) { scanf("%lf%d",&r,&n); for(i=0;i<n;i++) scanf("%lf",&w[i]); for(i=0;i<(1<<n);i++) { value[i]=0; for(j=0;j<n;j++) { if(i&(1<<j)) value[i]+=w[j]; } } memset(num,0,sizeof(num)); memset(vis,false,sizeof(vis)); dfs((1<<n)-1); ans=-1; for(i=0;i<num[(1<<n)-1];i++) { if(adj[(1<<n)-1][i].l1+adj[(1<<n)-1][i].l2>ans) ans=adj[(1<<n)-1][i].l1+adj[(1<<n)-1][i].l2; } printf("%.20f\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator