链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
==========================
最主要的地方在于动态方程是:
dp[i]=max(dp[i],1-(1-dp[i-money])*(1-rp));
概率的算法是,例如:1-(1-0.2)*(1-0.3);
AC代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
int money[10050];
double rp[10050],dp[10050];
int allmoney,allnum;
double max(double a,double b)
{
if(a>b)
return a;
else
return b;
}
void ZeroOnePack(int money,double rp)
{
int i;
for(i=allmoney;i>=money;i--)
{
dp[i]=max(dp[i],1-(1-dp[i-money])*(1-rp));
}
}
int main()
{
while(scanf("%d %d",&allmoney,&allnum))
{
if(allmoney==0&&allnum==0)
break;
memset(dp,0,sizeof(dp));
int i;
for(i=0;i<allnum;i++)
scanf("%d %lf",&money[i],&rp[i]);
for(i=0;i<allnum;i++)
ZeroOnePack(money[i],rp[i]);
dp[allmoney]*=100;
printf("%.1lf%%\n",dp[allmoney]);
}
return 0;
}