题目大意:就是给出该学生攒下的总money 还有各校的学费以及该学生能上该学校的概率,求该学生能接到至少一份offer的最大概率
思路:也就是求该学生没有得到一份offer的最小概率..01背包..注意边界值..
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iomanip>
using namespace std;
double dp[10005];
int weight[1005];
double value[1005];
double min(double a ,double b)
{
if(a-b>=0.001)
return b;
return a;
}
int main()
{
int money,numSchool;
while(scanf("%d%d",&money,&numSchool)!=EOF,money+numSchool)
{
for(int i=1;i<=numSchool;i++)
scanf("%d%lf",&weight[i],&value[i]);
dp[0]=1;//!!!没有投钱,所以没有接到offer的最大概率为1
for(int i=1;i<=money;i++)
dp[i]=1;
for(int i=1;i<=numSchool;i++)
{
for(int g=money;g>=weight[i];g--)
{
dp[g]=min(dp[g],dp[g-weight[i]]*(1-value[i]));
}
}
printf("%.1lf%%\n",(1-dp[money])*100);
}
return 0;}