拖欠了好久的背包专题的题解呢。。。
题意:
中文题,也就是告诉你现在拥有n万元钱,然后每个学校有不同的申请费用a,并且有得到该学校的offer的可能性b。然后问你至少得到一份offer的最大概率是多少。
思路:
因为题目中说是至少得到一份offer,所以我们可以求它的反命题,求没有得到一份offer的最小概率是多少。
定义:dp[i]为花费i元钱,没有得到一份offer的最小概率是多少。
记得我们应该先把dp[i]全都初始化为1.0。
然后就像01背包那样转化就好了。
但是注意这里概率是要相乘来得到的,因为dp[i]代表的是概率。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 10010
int a[maxn];
double b[maxn],dp[maxn];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
for(int i=1;i<=m;i++) scanf("%d%lf",&a[i],&b[i]);
fill(dp,dp+n+1,1.0);
for(int i=1;i<=m;i++){
for(int j=n;j>=0;j--){
if(j>=a[i]) dp[j]=min(dp[j],dp[j-a[i]]*(1.0-b[i]));
}
}
double ans=dp[n];
printf("%.1lf%%\n",(1-ans)*100.0);
}
}