题目大意:Speakless要拿offer但是每一个offer都有一定概率和费用,但是他都钱是有限的,问最少有一个offe的概率
思路:动态规划 01背包问题,只是再计算获取录取概率时,用1-p,算出不录取的概率,最后算出不录取的最大的概率,最后输出录取的概率,需要注意的是要对dp数组预处理,把它变成1。(这个题用n&&m 会 re n||m 则 ac)。
#include<stdio.h>
double g[10005];
int me[10005];
double dp[10005];
double min(double a,double b){
if(a>b)return b;
returna;
}
int main(void){
int n,m;
while(scanf("%d%d",&n,&m),n||m){
inti;
for(i=0;i<m;i++){
scanf("%d%lf",&me[i],&g[i]);
g[i]=1-g[i];//处理数据变成不录取的方便计算
}
intj;
for(i=0;i<=n;i++)dp[i]=1;
for(i=0;i<m;i++){
for(j=n;j>=me[i];j--){
dp[j]=min(dp[j],dp[j-me[i]]*g[i]);//核心变换方程
}
}
printf("%.1lf%%\n",(1-dp[n])*100);
}
return0;
}