HDU 1203 I NEED A OFFER! 01背包

时间:2024-12-06 11:07:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203

解题思路:简单的01背包,用dp[i]表示花费不超过i时的最大可能性

状态转移方程 dp[i]=1-(1-dp[i-a])*(1-p)

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10001
int n,m;
double dp[N];
int main()
{
int i,a,j;
double p,pp;
while(scanf("%d%d",&n,&m),n||m)
{
memset(dp,,sizeof(dp));
for(i=;i<m;i++)
{
scanf("%d%lf",&a,&p);
for(j=n;j>=a;j--)
{
pp=-(-dp[j-a])*(-p);
dp[j]=max(dp[j],pp);
}
// for(int k=1;k<=n;k++)cout<<dp[k]<<' ';cout<<endl;
}
p=dp[n]*;
printf("%.1lf%%\n",p);
}
return ;
}