HDU 1203 I NEED A OFFER! 简单DP

由于受定势思维的的影响,一直没想到反过来去求他没有被录上的情况,其实44.0%是这样来的,就是1-((1-0.2)*(1.0.3)),(1-0.2)*(1.0.3)是最小的被录取的情况,同时该题是一道01背包。

#include<stdio.h>

#include<stdlib.h>

float DP( int money[],float a[], int N ,int M)

{

     float f[10024];

     for( int i=0; i<=M; i++ )

        f[i]=1;

     for( int i=1; i<=N; i++ )

     {

         for( int j=M; j>=0; j-- )

              if( j>=money[i]&&f[ j-money[i] ]*a[i]<f[j] )//发过来求最小的不可能录取概率

                  f[j]= f[ j-money[i] ]*a[i];    

     }

       return f[M];

}

int main()

{

    int N,M,money[1024];

    float a[1024],b[1024];

    while(scanf( "%d%d",&M,&N ),M||N)

    {

         for( int i=1;i<=N; i++  )

         {

           scanf( "%d%f",&money[i],&a[i] );

           b[i]=1-a[i];

           }

          printf( "%.1f%%\n",100*(1-DP(money,b,N,M)) );             

    }    

}

  

你可能感兴趣的:(HDU)