博客里面还有以前写的解题报告,表示没看懂。这里直接计算其没有被录取的概率,每次去小的值即可
代码如下:
#include#include #include #define MAXN 1005using namespace std;int N, M, s[MAXN];double p[MAXN], dp[10005];inline double min(double x, double y){ return x < y ? x : y;}void zobag(int x){ for (int i = N; i >= s[x]; --i) { dp[i] = min(dp[i], dp[i-s[x]]*p[x]); } }double DP(){ for (int i = 1; i <= M; ++i) { zobag(i); } return 100-100*dp[N];}int main(){ while (scanf("%d %d", &N, &M), N|M) { for (int i = 0; i <= N; ++i) { dp[i] = 1; } for (int i = 1; i <= M; ++i) { scanf("%d %lf", &s[i], &p[i]); p[i] = 1.0-p[i]; } printf("%.1lf%%\n", DP()); } return 0;}