HDU2955+DP+背包变形

View Code
 1 /*
 2 dp[ i ]:偷钱i而不被抓的最大概率(因为要使得被抓的概率最小)
 3 开始想把dp[i]定义为概率为i的最大价值,因为把i放大了100,不过还是不够。
 4 然后看题解才明白要转化,dp[i]:偷i这么多钱的最大不被捕的概率,也就是不被抓的最小概率
 5 */
 6 #include<stdio.h>
 7 #include<string.h>
 8 #include<algorithm>
 9 using namespace std;
10 const int maxn = 10015;
11 double dp[ maxn ];
12 int vi[ maxn ];
13 double pi[ maxn ];
14 
15 int main(){
16     int T;
17     scanf("%d",&T);
18     while( T-- ){
19         int n;
20         double V;
21         scanf("%lf%d",&V,&n);
22         int sum = 0;
23         for( int i=0;i<n;i++ ){
24             scanf("%d%lf",&vi[i],&pi[i]);
25             sum += vi[i];
26         }
27         memset( dp,0,sizeof( dp ) );
28         dp[ 0 ] = 1;
29         int res = 0;
30         for( int i=0;i<n;i++ ){
31             for( int j=sum;j>=vi[i];j-- ){
32                 dp[ j ] = max( dp[ j ],dp[ j-vi[i] ]*( 1-pi[i] ) );
33                 if( dp[j]>=(1-V) ) res = max( res,j );
34             }
35         }
36         printf("%d\n",res);
37     }
38     return 0;
39 }

 

posted @ 2013-05-08 19:25  xxx0624  阅读(211)  评论(0编辑  收藏  举报