题目大意:中问题就不说了 ^—^~
题目思路:从题目来看是很明显的01背包问题,被录取的概率记为v[],申请费用记为w[]。但是我们可以预先做个处理,使问题解决起来更方便:v[]数组保留不被录取的概率,则dp[j]则代表在j元费用下,不被录取的最低概率是多少,最后用1减去dp[n]即可。
dp式子为:dp[j]=min(dp[j],dp[j-w[i]]*v[i]); (j表示共有j元申请费用)。
详细看代码注释
#include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 1000005 #define mod 1000000007 using namespace std; int w[MAX]; double v[MAX],dp[MAX]; int main() { int n,m,i,j; while(scanf("%d%d",&n,&m),n+m) { for(i=1;i<=m;i++) { scanf("%d%lf",&w[i],&v[i]); v[i]=1-v[i];//保留不被录取的概率 } for(i=0;i<MAX;i++) dp[i]=1; for(i=1;i<=m;i++) { for(j=n;j>=w[i];j--) { dp[j]=min(dp[j],dp[j-w[i]]*v[i]); } } printf("%.1lf%%\n",(1-dp[n])*100);//【1-(不被任何大学录取的概率)】=至少被一个大学录取的概率 } return 0; }
时间: 2024-10-16 22:38:47