DP太差了 现在开始练习DP
http://acm.hdu.edu.cn/showproblem.php?pid=2955
参考这里:http://blog.csdn.net/bingfengxuelian0/article/details/5505956
Robberies
背包问题:
正确的方程是:dp[j]=max(dp[j],dp[j-mj[i]]*(1-pj[i])) 其中,dp[i]表示抢j块大洋的最大的逃脱概率,
初始化为:f[0]=1,其余初始化为-1 (抢0块大洋肯定不被抓嘛)
得到的经验是:问题可以从反面想,算抢n家银行的概率要容易的多,容易想出DP方程
#include <cstdio>
#include <cstring>
#define clr(a,b) memset(a,b,sizeof(a))
double dp[10010];
int mj[110];
double pj[110];
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
clr(dp,0);
dp[0]=1;
int N,sum=0;
double P;
scanf("%lf%d",&P,&N);
for(int i=1; i<=N; i++)
{
scanf("%d%lf",&mj[i],&pj[i]);
sum+=mj[i];
}
for(int i=1; i<=N; i++)
for(int j=sum; j>=mj[i]; j--)
dp[j] = dp[j] > dp[j-mj[i]]*(1-pj[i]) ? dp[j] : dp[j-mj[i]]*(1-pj[i]);
P = 1-P;
for(int i=sum; i>=0; i--)
{
if(dp[i]>=P)
{
printf("%d\n",i);
break;
}
}
}
}