题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955
//0-1背包的例子。只不过里面出了一个概率。
#include <iostream>
using namespace std;
double max(double a, double b)
{
if(a>b)
return a;
else
return b;
}
double dp[10000], p[110], pi; //pi表示被抓到的概率,则1-pi就是没被抓到的概率。
int a[110], n;
int main()
{
int t, i, sum, j;
while(cin>>pi>>n)
{
sum = 0;
for(i = 1; i <= n; i++)
{
cin>>a[i]>>p[i];
sum += a[i]; //用可以抢到的总得钱数当成背包的容量。那么每个银行的钱数就是没见物品所占的容量
}
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(i = 1; i <= n; i++)
{
for(j = sum; j >= a[i]; j--)
{
dp[j] = max(dp[j], dp[j-a[i]]*(1-p[i]));//要么抢j元,要么抢j-m[i]元 ,因为要抢到j元,前提是前面抢i元时没有被抓到,所以是*(1-p[i])
}
}
for(j = sum; j >= 0; j--)
{
if(dp[j] >= 1-pi)
{
cout<<j<<endl;
break;
}
}
}
return 0;
}