• HDU 2955(01背包)


    http://acm.hdu.edu.cn/showproblem.php?pid=2955

    这道题求不被抓时的最大金钱。金额是整数,概率是小数。因为数组小标不能是小数,所以我们可以以钱作为weight,概率作为value

    这说明解背包问题时cost和weight不是定死的,是可以相互转换的。

    以银行的的总金额作为V,安全概率作为value,金额作为cost,安全概率=各家银行安全概率之积

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    using namespace std;
    
    #define MEM(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define debug printf("!/m")
    #define INF 8000
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    #define ep 1e-6
    
    double dp[INF];
    
    double ci[INF];//容量
    int wi[INF];//价值
    int n,V,i,j,v,t,sum;
    double vi;
    
    
    void zeroOnePack(int cost,double weight)
    {
              for(v = sum;v>=cost;v--)
              {
                        dp[v] =MAX(dp[v],dp[v-cost]*weight);
              }
    }
    
    void completePack(int cost,int weight)
    {
              for(v = cost;v<=V;v++)
              {
                        dp[v] =MAX(dp[v],dp[v-cost]+weight);
                        pf("tt%d %d %d
    ",i,v,dp[v]);
              }
    
    }
    
    int main()
    {
    
              sf("%d",&t);
              while(t--)
              {
                        sf("%lf%d",&vi,&n);
    
                        MEM(dp,0);
                        dp[0] = 1.0;
    
                        MEM(ci,0);
                        MEM(wi,0);
    
                        vi = 1-vi;
    
                        sum = 0;
    
                        for(i = 1;i<=n;i++)
                        {
                                  sf("%d",&wi[i]);
                                  sf("%lf",&ci[i]);
                                  ci[i] = 1-ci[i];
                                  sum+=wi[i];
                        }
    
                        for(i = 1;i<=n;i++)
                        {
                                  zeroOnePack(wi[i],ci[i]);
                        }
    
    
                        for(i = sum;i>=0;i--)
                        {
                                  if(dp[i]-vi>0.000000001)
                                  {
                                            pf("%d
    ",i);
                                            break;
                                  }
                        }
              }
        return 0;
    }

    78MS

  • 相关阅读:
    Linux常用操作命令总结
    Centos7安装FastDFS教程
    Permutation Sequence
    Next Permutation
    Remove Element
    4Sum
    3Sum Closest
    3Sum
    Longest Consecutive Sequence
    Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/qlky/p/5033648.html
Copyright © 2020-2023  润新知