您的位置:首页 > Web前端

HDU 1203 I NEED A OFFER! ,01背包改编。

2012-08-17 20:05 387 查看

链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: