分析:
这是一道概率DP的题目。注意:
1、要初始化成1.0
2、用补集求概率
3、DP的过程中,概率要相乘而不是相加或者相减
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ms(x, y) memset(x, y, sizeof(x))
const double PI = acos(-1.0), eps = 1e-8;
int main() {
int n,m;
int i,j,k;
int V[10010];
double W[10010],dp[10010];
while(scanf("%d %d",&n,&m) && (n || m)) {
for(i=1;i<=m;i++) {
scanf("%d %lf",&V[i],&W[i]);
//這裏要計算不能的概率(补集思想)
W[i] = 1.0-W[i];
}
// dp数组初始化(假设不管多少钱都不能通过) 必须初始化到0
for(i=0;i<=n;i++)
dp[i] = 1.0;
for(i=1;i<=m;i++) { // 遍历学校
for(j=n;j>=V[i];j--) { // 遍历各种价格情况
// 对当前我手上j万元,到底要还是不要投第i个学校
dp[j] = min(dp[j],dp[j-V[i]]*W[i]);
}
}
// dp[n]即是代表 n万元 对应的求学成功的概率
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}