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 }

 

你可能感兴趣的:(HDU)