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)) );             
    }    
}

  

posted @ 2011-08-05 10:22  wutaoKeen  阅读(161)  评论(0编辑  收藏  举报