HDU - 2955
Posted xFANx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 2955相关的知识,希望对你有一定的参考价值。
还是01背包问题,只是这里是与概率有关的问题,所以在选取两件物品时概率是相乘的而不是相加
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 struct bag { 8 int v; 9 double p; 10 } Bag[10010]; 11 double dp[10010]; 12 13 int main(int argc, const char * argv[]) { 14 15 int N, T; 16 double sfp; 17 scanf("%d", &T); 18 while (T--) { 19 scanf("%lf%d", &sfp, &N); 20 int sum = 0; 21 for (int i = 0; i < N; i++) { 22 scanf("%d%lf", &Bag[i].v, &Bag[i].p); 23 sum += Bag[i].v; 24 } 25 memset(dp, 0, sizeof(dp)); 26 dp[0] = 1;//此时安全概率 27 for (int i = 0; i < N; i++) { 28 for (int j = sum; j >= Bag[i].v; j--) { 29 dp[j] = max(dp[j], dp[j - Bag[i].v] * (1 - Bag[i].p));//概率应该相乘 30 } 31 } 32 for (int i = sum; i >= 0; i--) { 33 if (sfp > 1 - dp[i]) { 34 printf("%d\n", i); 35 break; 36 } 37 } 38 } 39 return 0; 40 }
以上是关于HDU - 2955的主要内容,如果未能解决你的问题,请参考以下文章