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

浙公网安备 33010602011771号