01背包变形
题目有要求至少收到一份offer的最大概率,只要求得不到的最小概率即可,
状态方程
dp[j]=Min(dp[j],dp[j-va[i]]*pro[i])//pro[i]表示得不到的概率,dp[n]表示得不到的最小概率,结果用1减去即可
再就是注意保留小数输出和%%输出%
#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int va[1005];
double pro[1005],dp[1005],a;
double Min(double x,double y)
{
return x<y?x:y;
}
int main()
{
int n,m;
while(cin>>n>>m&&(n||m))
{
for(int i=1;i<=m;i++)
{cin>>va[i]>>pro[i];
pro[i]=1-(pro[i]);}
for(int i=0;i<=n;i++)
dp[i]=1.0;
for(int i=1;i<=m;i++)
{
for(int j=n;j>=va[i];j--)
{
dp[j]=Min(dp[j],dp[j-va[i]]*pro[i]);
}
}
printf("%.1f%%\n",(1-dp[n])*100);
}
return 0;
}