01背包。
用01背包计算出一个学校都没有被录取的最小概率。
用1减去上面的概率就是答案。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; double dp[10010]; int m,n; int c[10010]; double v[10010]; int main() { while(~scanf("%d%d",&m,&n)) { if(m==0&&n==0) break; for(int i=1; i<=n; i++) { scanf("%d%lf",&c[i],&v[i]); v[i]=1.0-v[i]; } for(int j=0; j<=m; j++) dp[j]=1.0; for(int i=1; i<=n; i++) for(int j=m; j>=c[i]; j--) dp[j]=min(dp[j],dp[j-c[i]]*v[i]); double Min=1; for(int i=0; i<=m; i++) Min=min(Min,dp[i]); printf("%.1lf%% ",(1-Min)*100); } return 0; }