HDU 2955

01背包变形

dp[ i ][ j ]:表示从前 i 家银行中抢劫某些家,得到 j 价值 而不被抓住的概率。

类似01背包:dp[ j ]=max( dp[ j ],dp[ j - val[ i ] ]*( 1-w[ i ] ) ) );

View Code
 1 /*
 2 01 背包 变异
 3 dp[ i ]:偷i元的money不被抓的概率
 4 */
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<string.h>
 8 #include<iostream>
 9 #include<algorithm>
10 #include<queue>
11 #include<map>
12 #include<math.h>
13 using namespace std;
14 const int maxn = 10005;
15 const int inf = 0x7fffffff;
16 double dp[ maxn ];
17 int val[ maxn ];
18 double w[ maxn ];
19 int n,sum;
20 double tol;
21 double fmax( double a,double b ){
22     return a>b?a:b;
23 }
24 int main(){
25     int T;
26     scanf("%d",&T);
27     while( T-- ){
28         int n;
29         scanf("%lf%d",&tol,&n);
30         sum=0;
31         for( int i=0;i<n;i++ ){
32             scanf("%d%lf",&val[ i ],&w[ i ]);
33             sum+=val[ i ];
34         }
35         memset( dp,0,sizeof(dp) );
36         dp[ 0 ]=1;
37         int ans=0;
38         for( int i=0;i<n;i++ ){
39             for( int j=sum;j>=val[i];j-- ){
40                 if( dp[j]<dp[ j-val[i] ]*(1-w[i]))
41                 dp[j]=dp[ j-val[i] ]*(1-w[i]);
42                 //dp[ j ]=fmax( dp[ j ],dp[ j-val[i] ]*(1-w[i]) );
43             }
44         }
45         for( int i=sum;;i-- ){
46             if( dp[i]>=(1-tol) ){
47                 ans=i;
48                 break;
49             }
50         }
51         printf("%d\n",ans);
52     }
53     return 0;
54 }

 

 

posted @ 2012-12-13 23:23  xxx0624  阅读(231)  评论(0编辑  收藏  举报