链接:点击打开链接
题意:给出n个可以抢劫的银行,和被抓到的概率p,求在不被抓到的情况下,最多能够抢多少钱
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int a[105];
double b[105],dp[105][10005];
int main(){
double p;
int t,n,i,j,ans,cas,sum;
scanf("%d",&t); //dp[i][j]表示抢劫到i个银行,获得j元被抓的最小概率
for(cas=1;cas<=t;cas++){
scanf("%lf%d",&p,&n);
sum=0;
for(i=1;i<=n;i++){
scanf("%d%lf",&a[i],&b[i]);
sum+=a[i];
}
for(i=1;i<=n;i++)
for(j=0;j<=sum;j++)
dp[i][j]=INF*2.0;
dp[1][0]=0;
dp[1][a[1]]=b[1];
for(i=2;i<=n;i++){
for(j=0;j<=sum;j++){ //就是普通的01背包
dp[i][j]=min(dp[i][j],dp[i-1][j]);
if(j>=a[i]) //上一次被抓+上一次没被抓的概率*b[i]
dp[i][j]=min(dp[i][j],dp[i-1][j-a[i]]+(1-dp[i-1][j-a[i]])*b[i]);
}
}
ans=0;
for(j=sum;j>=0;j--){
if(dp[n][j]<=p){
ans=j;
break;
}
}
printf("Case %d: %d\n",cas,ans);
}
return 0;
}