题目链接:LightOJ-1079-Just another Robbery
设
dp[i]
表示抢到
i
<script type="math/tex" id="MathJax-Element-72">i</script> 单位钱不被抓的最大概率。
然后进行类似01背包的dp,最后遍历一遍,把最大符合条件的选出来为答案即可。
#include<bits/stdc++.h>
using namespace std;
double dp[10007],p[107];
int a[107];
int main()
{
int T;
scanf("%d",&T);
int kase=1;
while(T--)
{
int n;
double P;
cin>>P>>n;
P=1-P;
int m=0;
for(int i=0;i<n;i++)
{
cin>>a[i]>>p[i];
p[i]=1-p[i];
m+=a[i];
}
for(int i=0;i<=m;i++) dp[i]=0;
dp[0]=1;
for(int i=0;i<n;i++)
{
for(int j=m;j>=a[i];j--)
{
if(dp[j-a[i]]*p[i]<P) continue;
dp[j]=max(dp[j],dp[j-a[i]]*p[i]);
}
}
int ans=0;
for(int i=m;i>=0;i--)
{
if(dp[i]>=P)
{
ans=i;
break;
}
}
printf("Case %d: %d\n",kase++,ans);
}
return 0;
}