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;
}
posted @ 2012-08-09 20:50  willzhang  阅读(215)  评论(0编辑  收藏  举报