HDU2955+DP+背包变形
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 dp[ i ]:偷钱i而不被抓的最大概率(因为要使得被抓的概率最小) 3 开始想把dp[i]定义为概率为i的最大价值,因为把i放大了100,不过还是不够。 4 然后看题解才明白要转化,dp[i]:偷i这么多钱的最大不被捕的概率,也就是不被抓的最小概率 5 */ 6 #include<stdio.h> 7 #include<string.h> 8 #include<algorithm> 9 using namespace std; 10 const int maxn = 10015; 11 double dp[ maxn ]; 12 int vi[ maxn ]; 13 double pi[ maxn ]; 14 15 int main(){ 16 int T; 17 scanf("%d",&T); 18 while( T-- ){ 19 int n; 20 double V; 21 scanf("%lf%d",&V,&n); 22 int sum = 0; 23 for( int i=0;i<n;i++ ){ 24 scanf("%d%lf",&vi[i],&pi[i]); 25 sum += vi[i]; 26 } 27 memset( dp,0,sizeof( dp ) ); 28 dp[ 0 ] = 1; 29 int res = 0; 30 for( int i=0;i<n;i++ ){ 31 for( int j=sum;j>=vi[i];j-- ){ 32 dp[ j ] = max( dp[ j ],dp[ j-vi[i] ]*( 1-pi[i] ) ); 33 if( dp[j]>=(1-V) ) res = max( res,j ); 34 } 35 } 36 printf("%d\n",res); 37 } 38 return 0; 39 }
keep moving...