hdu2955 Robberies (01背包)

来源:互联网 发布:matlab 如何遍历数组 编辑:程序博客网 时间:2024/05/17 07:35

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955


最小风险概率=1-最大安全概率

状态转移方程dp[j]=max(dp[j-val[i]]*weight[i],dp[j])


#include <stdio.h>#include <string.h>#define MAXN 10002double dp[MAXN],weight[MAXN];int val[MAXN];int main(){int n,test,i,j,sum;double P;scanf("%d",&test);while(test--){scanf("%lf %d",&P,&n);P=1-P;sum=0;for(i=0;i<n;++i){scanf("%d %lf",&val[i],&weight[i]);weight[i]=1-weight[i];sum+=val[i];}memset(dp,0,sizeof(dp));dp[0]=1;//抢劫的金额为0时,肯定是安全的for(i=0;i<n;++i){for(j=sum;j>=val[i];--j)if(dp[j]<dp[j-val[i]]*weight[i])dp[j]=dp[j-val[i]]*weight[i];}for(i=sum;i>=0;--i){if(dp[i]-P>=1e-8){printf("%d\n",i);break;}}}return 0;}