HDU 2955
01背包变形
dp[ i ][ j ]:表示从前 i 家银行中抢劫某些家,得到 j 价值 而不被抓住的概率。
类似01背包:dp[ j ]=max( dp[ j ],dp[ j - val[ i ] ]*( 1-w[ i ] ) ) );
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 01 背包 变异 3 dp[ i ]:偷i元的money不被抓的概率 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<string.h> 8 #include<iostream> 9 #include<algorithm> 10 #include<queue> 11 #include<map> 12 #include<math.h> 13 using namespace std; 14 const int maxn = 10005; 15 const int inf = 0x7fffffff; 16 double dp[ maxn ]; 17 int val[ maxn ]; 18 double w[ maxn ]; 19 int n,sum; 20 double tol; 21 double fmax( double a,double b ){ 22 return a>b?a:b; 23 } 24 int main(){ 25 int T; 26 scanf("%d",&T); 27 while( T-- ){ 28 int n; 29 scanf("%lf%d",&tol,&n); 30 sum=0; 31 for( int i=0;i<n;i++ ){ 32 scanf("%d%lf",&val[ i ],&w[ i ]); 33 sum+=val[ i ]; 34 } 35 memset( dp,0,sizeof(dp) ); 36 dp[ 0 ]=1; 37 int ans=0; 38 for( int i=0;i<n;i++ ){ 39 for( int j=sum;j>=val[i];j-- ){ 40 if( dp[j]<dp[ j-val[i] ]*(1-w[i])) 41 dp[j]=dp[ j-val[i] ]*(1-w[i]); 42 //dp[ j ]=fmax( dp[ j ],dp[ j-val[i] ]*(1-w[i]) ); 43 } 44 } 45 for( int i=sum;;i-- ){ 46 if( dp[i]>=(1-tol) ){ 47 ans=i; 48 break; 49 } 50 } 51 printf("%d\n",ans); 52 } 53 return 0; 54 }
keep moving...