Any ideas would be great
![:D](./images/smilies/icon_biggrin.gif)
Code: Select all
#include <stdio.h>
int b;
int t;
double f;
double a[1024][101][101];
double p[10];
int s[10];
int fails[10];
double dp(int mask, int fail, int time)
{
if(mask == (1 << b) - 1) //All done!
return 0;
if(a[mask][fail][time] != -1) //Already computed!
return a[mask][fail][time];
if(time == 0) //No time left!
return 0;
int bug = 0;
double exp = 0;
double psucc = 0;
for(int i=0;i < b;i++)
{
if(p[i]*s[i] > exp && (mask & (1 << i)) == 0)
{
psucc = p[i];
exp = p[i]*s[i];
bug = i;
}
}
double rtn = 0;
//On success...
rtn += psucc * (s[bug] + dp(mask | (1 << bug), fail - fails[bug], time - 1));
//On failure...
//Mark
p[bug] *= f;
fails[bug]++;
//Recurse
rtn += (1-psucc) * dp(mask, fail+1, time - 1);
//Unmark
p[bug] = psucc;
fails[bug]--;
a[mask][fail][time] = rtn;
return rtn;
}
int main()
{
while(scanf("%d %d %lf", &b, &t, &f) != EOF)
{
for(int i=0;i < b;i++)
{
scanf("%lf %d", p + i, s + i);
fails[i] = 0;
}
for(int i=0;i < (1 << b);i++)
for(int j=0;j <= t;j++)
for(int k=0;k <= t;k++)
a[i][j][k] = -1;
printf("%lf\n", dp(0, 0, t));
}
}