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