【HDU 2955】Robberies(DP)
题意是给你抢劫每个银行可获得的钱m和被抓的概率p,求被抓的概率小于P,最多能抢多少钱。
01背包问题,体积是m,价值是p。
被抓的概率不是简单相加,而应该是1−Π(1−p[i])
DP:dp[i]表示抢到i元且不被抓的概率。
初始条件:dp[0]=1;
转移方程:dp[j]=max{dp[j],dp[j−m[i]]∗(1−p[i])}(j>=m[i])
#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]); } }
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆