题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
题目大意:选出所有满足条件的最大概率,依次对他们求对立面概率再相乘,即为一份都不能获得offer的概率,再求对立即为答案
#include<iostream>
#include<iomanip>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
using namespace std;
double F[10010],W[10010];
int C[10010];
int N,M;
void ZeroOnePack(double F[],int C[],double W[])
{
int i,j;
for(i=0;i<=N;i++)
F[i]=1;
for(i=1;i<=M;i++)
for(j=N;j>=C[i];j--)
F[j]=min(F[j],F[j-C[i]]*W[i]);
}
int main()
{
int i;
while(cin>>N>>M&&(N||M))
{
for(i=1;i<=M;i++)
{
cin>>C[i]>>W[i];
W[i]=1-W[i];
}
ZeroOnePack(F,C,W);
cout<<fixed<<setprecision(1)<<(1-F[N])*100<<"%"<<endl;
}
return 0;
}
本文提供了一道关于概率计算的问题解答,通过动态规划的方法求解最大概率下不能获得offer的情况,最终给出至少获得一个offer的概率。
1万+

被折叠的 条评论
为什么被折叠?



