题意是给你抢劫每个银行可获得的钱m和被抓的概率p,求被抓的概率小于P,最多能抢多少钱。
01背包问题,体积是m,价值是p。
被抓的概率不是简单相加,而应该是)
#include<cstdio> #include<cstring> #include<algorithm> #define N 105 using namespace std; int t, n, m[N]; double P, p[N], dp[10200]; int main() { scanf("%d", &t); while(t--) { memset(dp, 0, sizeof dp); m[0] = 0; scanf("%lf %d", &P, &n); for(int i = 1; i <= n; i++) { scanf("%d %lf", &m[i], &p[i]); m[0] += m[i]; } dp[0] = 1; for(int i = 1; i <= n; i++) for(int j = m[0]; j >= m[i]; j--) dp[j] = max(dp[j], dp[j - m[i]] * (1 - p[i])); while(P<=1-dp[m[0]])m[0]--; printf("%d\n", m[0]); } }