hdu 1203

时间:2023-03-09 17:18:04
hdu 1203

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

思路:01背包问题,求一份都拿不到的概率,状态转移方程dp[j]=min(dp[j],dp[j-val[i]]*p[i])

p[i]表示得不到的概率,(1-dp[j])为花费j元得到Offer的最大概率

 #include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std; int val[];
double dp[],p[]; double min(double a,double b)
{
if(a>b)
return b;
return a;
} int main()
{
int n,m;
while(scanf("%d %d",&n,&m),n+m)
{
for(int i=;i<=m;i++)
{
scanf("%d %lf",&val[i],&p[i]);
p[i]=-p[i]; } for(int i = ;i<=n;i++)
dp[i] = 1.0; for(int i=;i<=m;i++)
{
for(int j=n;j>=val[i];j--)
{
dp[j]=min(dp[j],dp[j-val[i]]*p[i]);
}
}
printf("%.1lf%%\n",(-dp[n])*);
}
return ;
}