题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
题 意:Roy想要抢劫,每家银行多有一定的金额和被抓到的概率,知道Roy被抓的最大概率P,求Roy在被抓的情况下,抢劫最多。
思 路:将所给银行的金额之和作为背包的容量,抢劫成功最为要放的物品,求出所有可能情况的概率,再从大到小比较得到结果。
代码如下:
#include <iostream>
using namespace std;
#include <string.h>
#include <stdio.h>
#include <queue>
#include <algorithm>
struct node
{
int m;
double p;
}vis[120];
double dp[2000];
int main()
{
int T;
scanf ( "%d", &T );
while( T-- )
{
int n, v = 0;
double P;
scanf ( "%lf %d", &P, &n);
P=1-P;
for( int i = 0; i < n; i ++ )
{
scanf ( "%d %lf",&vis[i].m, &vis[i].p);
vis[i].p=1-vis[i].p;
v += vis[i].m;
}
for( int i = 0 ; i<= v; i ++ )
dp[i]=0;
dp[0]=1;
for( int i = 0; i < n; i ++ )
{
for( int j = v; j >= vis[i].m; j -- )
dp[j] = max( dp[j], dp[j-vis[i].m]*vis[i].p );
}
for( int i = v; i >= 0; i -- )
{
if( dp[i] - P > 0.000000001)//精度要注意
{
printf("%d\n",i);
break;
}
}
}
return 0;
}