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

原文地址:https://www.cnblogs.com/qlky/p/5033648.html