题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
题 意:可将他自己总共n万美元看做背包容量,他得到offer的概率看做价值,假设a,b分别为在A,B学校得到offer得概率,则他得不到offer的概
率为(1-a)*(1-b),得到得概率为1-(1-a)*(1-b);由此可得递推公式:
dp[j]=max(dp[j],(1-(1-dp[j-vis[i].v])*(1-vis[i].p)));
注:
struct node {
int v;//申请费用
double p;//成功概率
}vis[10002];
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct point
{
int v;
double p;
} vis[10020];
double dp[10020];
int main()
{
int V, m, i, j;
while ( scanf( "%d %d", &V, &m ) != EOF )
{
if ( V == 0 && m == 0 ) break;
for ( i = 1; i <= m; i ++ )
{
scanf ( "%d %lf", &vis[i].v, &vis[i].p);
}
memset( dp, 0, sizeof(dp) );
for ( i = 1; i <= m; i ++ )
{
for ( j = V; j >= vis[i].v; j -- )
{
dp[j]=max(dp[j],(1-(1-dp[j-vis[i].v])*(1-vis[i].p)));
}
}
printf("%.1lf%%\n",dp[V]*100);
}
return 0;
}