01背包 坑爹的是 判断结束的条件写错了。。。。
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
inline double max( double a, double b ){
return ( a > b ? a : b );
}
inline double p( double a, double b ){
double pp;
pp = 1.0 - ( 1.0 - a ) * ( 1.0 - b );
return pp;
}
int main(){
int sum, m, w[10000];
double v[10000], dp[10001];
while( scanf( "%d%d", &sum, &m ) && !( m == 0 && sum == 0 ) ){
for( int i = 0; i < m; i++ ){
scanf( "%d%lf", &w[i], &v[i] );
}
memset( dp, 0, sizeof( dp ) );
for( int i = 0; i < m; i++ ){
for( int j = sum; j >= w[i]; j-- ){
dp[j] = max( dp[j], p( dp[j-w[i]], v[i] ) );
}
}
printf( "%.1lf%%\n", dp[sum] * 100 );
}
return 0;
}