HDU 1203 I NEED A OFFER 概率DP

来源:互联网 发布:深入浅出rails 知乎 编辑:程序博客网 时间:2024/04/27 23:14

传送门:HDU 1203 I NEED A OFFER

分析:
这是一道概率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;}
1 0
原创粉丝点击