01背包模板的变形,求其反面。如果你看清了题目要求的是“Speakless可能得到至少一份offer的最大概率P”那么这道题也就不难了。。。
在高中遇到这类的数学问题时,我们往往会“正难则反”,即求其对立面:Speakless一份offer也得不到的最小概率P1,那么所求概率P=1-P1。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node{
int a;
double b;
}num[10005];
int main(){
int n,m,i,j;
double dp[10005];
while(scanf("%d%d",&n,&m),n||m){
for(i=0;i<m;i++){
scanf("%d%lf",&num[i].a,&num[i].b);
num[i].b=1-num[i].b;//求出各项不能获得offer的概率
}
for(i=0;i<=n;i++)
dp[i]=1.0; //memset函数只能初始化为0,-1!!
for(i=0;i<m;i++){
for(j=n;j>=num[i].a;j--)//用01背包的思想求出最小概率
dp[j]=min(dp[j-1],dp[j-num[i].a]*num[i].b);
}
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}