hdu2955 Robberies
DP真心难。。。。不过这题还是比较简单的,
状态转移为d[j]=d[j]>d[j-value[i-1]]*probi[i-1]?d[j]:d[j-value[i-1]]*probi[i-1];
d[j]表示抢到j元的时候不被抓的最大概率
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<string.h> using namespace std; int sum;//能获得的最大值 double Floor; int value[110]; int n; double probi[110]; double d[10010]; int main() { int total; scanf("%d",&total); while(total--) { sum=0; double temp; scanf("%lf %d",&temp,&n); Floor=1-temp; int i,j; for(i=0;i<n;i++) { scanf("%d %lf",&value[i],&probi[i]); sum+=value[i]; probi[i]=1-probi[i];//换为不被抓的概率 } d[0]=1; for(i=1;i<=sum;i++) { d[i]=-1; } for(i=1;i<=n;i++) { for(j=sum;j>=0;j--) { if(j-value[i-1]<0) { continue; } d[j]=d[j]>d[j-value[i-1]]*probi[i-1]?d[j]:d[j-value[i-1]]*probi[i-1]; } } //for(i=sum;i>=0;i--) //{ // printf("%d ",d[i]); //} for(i=sum;i>=0;i--) { if(d[i]>Floor) { printf("%d\n",i); break; } } } return 0; }