#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX_N 105
//最多可以抢这么多钱
#define MAX_M 10005
int money[MAX_N];
//dp[i][j]表示抢前i家银行抢的j万元时的最大的被捕几率(对应最小的逃跑几率)
double dp[MAX_N][MAX_M];
//被抓的概率
double possibility[MAX_N];
int n;
int M;
//被抓的概率
double total;
int t,k;
int main()
{
//freopen("背包E.txt", "r",stdin);
scanf("%d",&t);
k=t;
while(t--)
{
scanf("%lf %d",&total,&n);
M=0;
for(int i=0;i<n;i++)
{
scanf("%d %lf",money+i,possibility+i);
M += money[i];
}
void solve();
solve();
}
return 0;
}
void solve()
{
fill(dp[0],dp[0]+M+1,0);
dp[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<=M;j++)
{
if(j<money[i])
{
dp[i+1][j]=dp[i][j];
}
else{
dp[i+1][j]=max(dp[i][j],dp[i][j-money[i]]*(1-possibility[i]));
}
}
}
int res=0;
for(int i=0;i<=M;i++)
{
//逃跑的机率要大于等于(1-total)
if(dp[n][i]>=(1-total))
res=i;
}
printf("%d\n",res);
}
HDU_2955_背包问题
最新推荐文章于 2020-06-30 17:49:06 发布