首页 > 代码库 > 01背包

01背包

 

Robberies

 HDU - 2955 

题意:小偷抢银行,问在被捕的概率不超过p的情况下最多抢多少钱。

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=10010;
 4 double f[maxn];  //不被捕的概率
 5 int v;
 6 double p;
 7 double x[maxn];
 8 int m[maxn];
 9 int main(){
10     int t;
11     scanf("%d",&t);
12     while(t--){
13         int n;
14         int ans=0;
15         memset(f,0,sizeof(f));
16         f[0]=1;
17         scanf("%lf%d",&p,&n);
18         int sum=0;
19         for(int i=0;i<n;i++){
20             scanf("%d%lf",&m[i],&x[i]);
21             sum+=m[i];
22         }
23         for(int i=0;i<n;i++)
24             for(int j=sum;j>=m[i];j--){
25                 f[j]=max(f[j],f[j-m[i]]*(1-x[i]));
26             }
27         for(int i=sum;i>0;i--){
28             if((1-f[i])<=p){
29                 ans=i;
30                 break;
31             }
32         }
33         printf("%d\n",ans);
34     }
35 }
View Code

 

01背包