分析:最大录取概率=1-最小不录取概率。
0-1背包求出最小不录取概率,然后用1减去即可。
注意dp数组初始化时概率要先设置为1,表示一开始被录取。
#include<iostream> using namespace std; double p[10001],dp[10001]; int v[10001]; int main() { int n,m,i,j; while(cin>>n>>m &&(n||m)) { for(i=0;i<m;i++) { cin>>v[i]>>p[i]; //p[i]为录取的概率 p[i]=1-p[i]; //1-p[i]为不被录取的概率 } for(i=0;i<=n;i++) dp[i]=1.0f; //开始初始化为1.0f,表示被录取 for(i=0;i<m;i++) for(j=n;j>=v[i];j--) if(dp[j]>dp[j-v[i]]*p[i]) dp[j]=dp[j-v[i]]*p[i]; printf("%.1lf%%\n",(1.0f-dp[n])*100); } return 0; }
时间: 2024-12-16 12:17:44