• HDU——2955 Robberies (0-1背包)


    题意:有N个银行,每抢一个银行,可以获得(v_i)的前,但是会有(p_i)的概率被抓。现在要把被抓概率控制在(P)之下,求最多能抢到多少钱。
    分析:0-1背包的变形,把重量变成了概率,因为计算概率需要乘积而非加法,所以不能直接用dp[j]表示概率为j时的最大收益。
    (dp[i][j])表示对前(i)个银行,抢到价值为(j)还能保持安全的概率,则有递推式:

    [dp[i][j] = dp[i-1][j-v[i]]*(1-p[i]) ]

    第一维其实可以节省下来,因为之和前一项有关,那么像0-1背包一样倒着推即可。
    最后求出满足安全概率的最大收益即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define eps 1e-7
    const int maxn = 1e4+5;
    typedef long long LL;
    double dp[maxn],p[maxn];
    int v[maxn];
    
    int main()
    {
    	#ifndef ONLINE_JUDGE
            freopen("in.txt","r",stdin);
            freopen("out.txt","w",stdout);
        #endif
        int T; scanf("%d ",&T);
    	dp[0] = 1.0;
        while(T--){
    		int n,sum=0;
    		double P;
    		cin>>P>>n;
    		P = 1- P;
    		memset(dp,0,sizeof(dp));
    		dp[0] = 1;
    
    		for(int i=1;i<=n;++i){
    			cin>>v[i]>>p[i];
    			p[i] = 1- p[i];
    			sum += v[i];
    		}
    		for(int i=1;i<=n;++i){
    			for(int j=sum;j>=v[i];--j){
    				if(dp[j-v[i]]*p[i] > dp[j])
    					dp[j] = dp[j-v[i]]* p[i];
    			}	
    		}
    
    		for(int i=sum;i>=0;--i){
    			if(dp[i]>P){
    				cout<<i<<endl;
    				break;
    			}
    		}
    	}
        return 0;
    }
    
  • 相关阅读:
    14. HTML 列表(无序, 有序, 定义)
    13. HTML table
    12. HTML图像
    11. HTML链接
    10. HTML CSS
    learning java AWT Pannel
    learning AWT Jrame
    learning java 正则表达式
    learning java java.time相关类
    learning java Calendar类
  • 原文地址:https://www.cnblogs.com/xiuwenli/p/9821435.html
Copyright © 2020-2023  润新知