hdu 2955 Robberies(01背包)

01背包的变形,因为概率P为浮点数所以不能作为背包容量,只能找能抢的最大金额作为容量。刚开始还傻傻地想求最小被抓的概率,但是细想被抓只有一次,所以只能求最大逃跑概率。

View Code
 1 /*

 2 Author:Zhaofa Fang

 3 Lang:C++

 4 */

 5 #include <cstdio>

 6 #include <cstdlib>

 7 #include <sstream>

 8 #include <iostream>

 9 #include <cmath>

10 #include <cstring>

11 #include <algorithm>

12 #include <string>

13 #include <utility>

14 #include <vector>

15 #include <queue>

16 #include <stack>

17 #include <map>

18 #include <set>

19 

20 using namespace std;

21 

22 typedef long long ll;

23 #define DEBUG(x) cout<< #x << ':' << x << endl

24 #define PII pair<int,int>

25 #define PB push_back

26 #define MP make_pair

27 #define FI first

28 #define SE second

29 #define lowbit(x) (x&(-x))

30 #define INF (1<<30)

31 

32 int m[105];

33 double p[105];

34 double dp[10005];

35 int main()

36 {

37     #ifndef ONLINE_JUDGE

38     freopen("in","r",stdin);

39     #endif

40     int T;

41     cin>>T;

42     while(T--)

43     {

44         double P;

45         int n;

46         scanf("%lf%d",&P,&n);

47         int M=0;

48         for(int i=1;i<=n;i++)scanf("%d%lf",&m[i],&p[i]),M+=m[i];

49         for(int i=1;i<=M;i++)dp[i] = 0;

50         dp[0] = 1;

51         for(int i=1;i<=n;i++)

52         {

53             for(int j=M;j>=m[i];j--)

54             {

55                 dp[j] = max(dp[j],dp[j-m[i]]*(1-p[i]));

56             }

57         }

58         int ans = 0;

59         for(int i=M;i>=0;i--)

60         {

61             if(P>=(1-dp[i]))

62             {

63 

64                 ans = i;

65                 break;

66             }

67         }

68         printf("%d\n",ans);

69     }

70     return 0;

71 }

你可能感兴趣的:(HDU)