Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1708 Accepted Submission(s): 780
Special Judge
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; double p[25]; int main() { int n,i,flag,j,k,all,cnt; double sum,s,temp; while(scanf("%d",&n)!=EOF) { flag=1; for(i=0;i<n;i++) { scanf("%lf",&p[i]); } sum=0; flag=1; all=1<<n; for(i=1;i<all;i++) { cnt=0; temp=0; for(j=0;j<n;j++) { if(i&(1<<j))//相交 { temp+=p[j];cnt++; } } if(cnt&1)//奇加偶减 sum+=1.0/temp; else sum-=1.0/temp; } printf("%.4f\n",sum); } return 0; }
再来一个状态压缩dp,这里我们可以推出dp[n]=1+all dp[n](空的)+all dp[n](重复的)+all dp[k](没有但是加一个就有了);这样就好做了,好像这一题还非要写成输出4位,输出3位还是错的,样例应该是有问题的!很坑啊,有木有!
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; double p[25],dp[1<<20]; int main () { int n,i,j,all; double allp,tempallp,sum; while(scanf("%d",&n)!=EOF) { allp=0; for(i=0;i<n;i++) { scanf("%lf",&p[i]); allp+=p[i]; } all=1<<n; dp[0]=0; for(i=1;i<all;i++) { tempallp=allp; sum=1;//买了一袋 for(j=0;j<n;j++) { if(i&(1<<j)) { sum+=p[j]*dp[i^(1<<j)]; } else { tempallp-=p[j]; } } dp[i]=sum/tempallp; } printf("%.4f\n",dp[all-1]); } return 0; }