标签:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstring> 7 #include<vector> 8 #include<queue> 9 #include<fstream> 10 using namespace std; 11 int N,L,K; 12 int tmp; 13 int pre[2000];//pre[i]=1 表示第 i次获胜 pre[i]=2表示失败 14 double ans; 15 inline void ser(int,int,int,int);//进行到了第几项 ,赢了几次,有几块碎片,背包总容量 16 inline double calc(); 17 struct node{ 18 int a; 19 double p; 20 }wupin[2000]; 21 inline int cmp(const node &b,const node &c){ 22 if(b.a>c.a) return 1; 23 return 0; 24 } 25 int main(){ 26 // freopen("guard.in","r",stdin); 27 // freopen("guard.out","w",stdout); 28 scanf("%d%d%d",&N,&L,&K); 29 for(int i=1;i<=N;i++){ 30 scanf("%d",&tmp); 31 wupin[i].p=(double)(tmp)/(double)(100); 32 } 33 for(int i=1;i<=N;i++){ 34 scanf("%d",&wupin[i].a); 35 } 36 sort(wupin+1,wupin+N+1,cmp); 37 ser(1,0,0,K); 38 printf("%.6f",ans); 39 return 0; 40 } 41 42 inline void ser(int now,int tot,int sum,int v){ 43 int fro=1; 44 if(wupin[now].a==-1&&v<=sum) fro++;//当前是碎片,但是再加碎片肯定装不进去 45 for(int i=fro;i<=2;i++){ 46 pre[now]=i; 47 if(now==N){ 48 if(i==1){ 49 if(wupin[now].a==-1) sum++; 50 else v+=wupin[now].a; 51 tot++; 52 } 53 if(v>=sum&&tot>=L){//残片可以全部拿走 54 ans+=calc(); 55 } 56 if(i==1){ 57 if(wupin[now].a==-1) sum--; 58 else v-=wupin[now].a; 59 tot--; 60 } 61 } 62 else{ 63 if(i==1){ 64 if(wupin[now].a==-1) ser(now+1,tot+1,sum+1,v); 65 else ser(now+1,tot+1,sum,v+wupin[now].a); 66 } 67 else ser(now+1,tot,sum,v); 68 } 69 } 70 } 71 72 inline double calc(){ 73 double temp=1.000000; 74 for(int i=1;i<=N;i++){ 75 if(pre[i]==1) temp*=wupin[i].p; 76 else if(pre[i]==2) temp=temp*double((double)(1)-wupin[i].p); 77 } 78 return temp; 79 }
100分的dp算法
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstring> 7 #include<vector> 8 #include<queue> 9 #include<fstream> 10 using namespace std; 11 int N,L,K; 12 int tmp; 13 struct node{ 14 int a; 15 double p; 16 }A[2000]; 17 double f[201][201][401];//f[i][k][j]=e 表示前 i件物品,共赢 k次,当前要装入所有碎片时容量为 j时的概率 18 double ans; 19 int main(){ 20 // freopen("guard.in","r",stdin); 21 // freopen("guard.out","w",stdout); 22 scanf("%d%d%d",&N,&L,&K); 23 for(int i=1;i<=N;i++){ 24 scanf("%d",&tmp); 25 A[i].p=(double)(tmp)/(double)(100); 26 } 27 for(int i=1;i<=N;i++) scanf("%d",&A[i].a); 28 if(K>=400){ 29 K=400; 30 f[0][0][K]=1; 31 } 32 else{ 33 f[0][0][200+K]=1; 34 } 35 36 for(int i=1;i<=N;i++){ 37 for(int j=0;j<=i;j++){ 38 for(int v=1;v<=400;v++){ 39 f[i][j][v]=f[i-1][j][v]*(1-A[i].p); 40 if(j==0) continue;//目前一场都没赢过 41 //下面表示赢 42 if(A[i].a==-1) f[i][j][v]+=f[i-1][j-1][v+1]*A[i].p; 43 else if(v-A[i].a>=0) f[i][j][v]+=f[i-1][j-1][v-A[i].a]*A[i].p; 44 } 45 } 46 } 47 for(int i=L;i<=N;i++) 48 for(int j=200;j<=400;j++) ans+=f[N][i][j] ; 49 printf("%.6f",ans); 50 return 0; 51 }
标签:
原文地址:http://www.cnblogs.com/CXCXCXC/p/4889633.html