HDU 2955(01背包)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define sc(x) scanf("%d",&(x))
 6 #define pf(x) printf("%d\n", x)
 7 #define CL(x, y) memset(x, y, sizeof(x))
 8 #define max(a, b) (a > b ? a : b)
 9 using namespace std;
10 const int MAX = 105;
11 struct node     //设置为背包问题,结构体
12 {
13     int p;
14     double w;
15 }bag[MAX];
16 double dp[MAX*MAX], P;//被抓的概率
17 int m, T, i, j, N;
18 int main()
19 {
20     sc(T);
21     while(T--)
22     {
23         m = 0;
24         scanf("%lf%d",&P, &N);
25         for(i=0; i<N; i++)
26         {
27             scanf("%d%lf",&bag[i].p,&bag[i].w);
28             m += bag[i].p;
29         }
30         CL(dp, 0);
31         dp[0] = 1;
32         for(i = 0; i < N; i++)
33             for(j = m; j >= bag[i].p; j--)
34                 dp[j] = max(dp[j], dp[j-bag[i].p]*(1-bag[i].w));
35         for(i = m; i>=0; i--)
36         {
37             if(dp[i] > 1-P)
38             {
39                 pf(i);
40                 break;
41             }
42         }
43     }
44     return 0;
45 }

思路1:假设总共抢了j元钱,被抓概率为DP[j],这j元钱里是否抢了第i个个银行,假设第i个银行有value[i][0]元,被抓的概率为value[i][1],所以DP[j] = min ( DP[j] , 1- ( 1-DP[j-value[0]] ) * ( 1-value[i][1] ) ).(设置value[][0]、value[][1])

思路2:最重要的是找动态转移方程,可以将所有银行里的钱看作背包容量,每一家银行的钱看作重量,不被抓到的概率看作价值,则转移方程为:dp[ j ]=max( dp[ j ] , dp[  j - bag[ i ].v]*( 1- bag[ i ].p ) );

时间: 2024-10-01 22:33:52

HDU 2955(01背包)的相关文章

Robberies hdu 2955 01背包

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10933    Accepted Submission(s): 4049 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that

HDU 2955 01背包

题意:一个人去抢银行,给你一个允许的最高被抓概率p,给你n个银行,然后给出n个银行的钱和抢劫该银行的被抓概率,求能获得的最大钱数 思路:开始一直在纠结那个被抓概率的小数问题,发现没办法直接去dp,得转化,可弱鸡我不会阿,看看题解,发现得方向转化一下,对不被抓概率dp 关键一个点我没想到抢多个银行之后不被抓的概率是抢每一个银行不被抓的概率之积,题目给出的是被抓概率,被题目误导了 1 #include<cmath> 2 #include<cstdio> 3 #include<cs

poj3211Washing Clothes(字符串处理+01背包) hdu1171Big Event in HDU(01背包)

题目链接: poj3211  hdu1171 这个题目比1711难处理的是字符串如何处理,所以我们要想办法,自然而然就要想到用结构体存储,所以最后将所有的衣服分组,然后将每组时间减半,看最多能装多少,最后求最大值,那么就很愉快的转化成了一个01背包问题了.... hdu1711是说两个得到的价值要尽可能的相等,所以还是把所有的价值分为两半,最后01背包,那么这个问题就得到了解决.. 题目: Washing Clothes Time Limit: 1000MS   Memory Limit: 13

hdu 1203 01背包 I need a offer

hdu 1203  01背包  I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offer的概率以及花费,给定money,求得到至少一份offer的最大概率. 简单的01背包 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 double

HDU 2955 Robberies 背包概率DP

A - Robberies Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2955 Appoint description: Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usu

HDU 2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 35815    Accepted Submission(s): 14753 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

hdu 1864 01背包 最大报销额

http://acm.hdu.edu.cn/showproblem.php?pid=1864 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18562    Accepted Submission(s): 5459

HDU 2639 01背包(分解)

http://acm.hdu.edu.cn/showproblem.php?pid=2639 01背包第k优解,把每次的max分步列出来即可 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct Node 6 { 7 int price; 8 int val; 9 }node[1005]; 10 int main() 11 { 12 i

HDU 2126 01背包(求方案数)

Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1886    Accepted Submission(s): 699 Problem Description When the winter holiday comes, a lot of people will have a trip. Genera

HDU 2639 01背包求第k大

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3718    Accepted Submission(s): 1903 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took par