I NEED A OFFER!
後面的m行,每行都有兩個數據ai(整型),bi(實型)分別表示第i個學校的申請費用和可能拿到offer的概率。
輸入的最後有兩個0。
題目鏈接:HDOJ 1203 I NEED A OFFER! 【0 1揹包 求反面】
思路:需要求其反面,要求至少一份offer的最大概率,就要求不能獲得offer的最小概率,最後用1-MIN(dp).
需要注意結束方式
已AC代碼:
#include<cstdio>
#include<cstring>
#define M 11000
double dp[M],p[M];
int a[M],n,m;
double Min(double x,double y)
{
return x<y?x:y;
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0)// 注意
break;
for(i=0;i<m;++i)
{
scanf("%d%lf",&a[i],&p[i]);
p[i]=1.0-p[i];
}
for(i=0;i<=n;++i)
dp[i]=1.0;
for(i=0;i<m;++i)
for(j=n;j>=a[i];--j)
dp[j]=Min(dp[j],dp[j-a[i]]*p[i]);
printf("%.1lf%%\n",(1-dp[n])*100);
}
return 0;
}