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 }

 

 

你可能感兴趣的:(HDU)