LightOJ1079(概率+01背包)

来源:互联网 发布:java命令行导入jar包 编辑:程序博客网 时间:2024/04/28 05:30

搞了半天我连01背包都不会,难受。
一眼就看出是01背包的题,结果搞了半天还没写出递推公式。T_T
dp[j]表示当抢j元RMB时,不被捉住的最大概率。
背包的最大容量是所有银行的钱数总和。
code:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>//a&3==a%4using namespace std ;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps = 1e-8;const int maxn = 10010;//须填写const int inf = 0x3f3f3f3f;double dp[maxn];double w[110];int c[110];int main(){    int _case;    scanf("%d",&_case);    for(int ii=1;ii<=_case;ii++)    {        memset(dp,0,sizeof(dp));        int n;        int v=0;        double flag;        scanf("%lf%d",&flag,&n);        for(int i=0;i<n;i++)        {            scanf("%d%lf",&c[i],&w[i]);            w[i]=1.00-w[i];            //printf("%d   %f\n",c[i],w[i]);            v+=c[i];        }        //printf("%d\n",v);        dp[0]=1.00;        flag=1.00-flag;        for(int i=0;i<n;i++)        {            for(int j=v;j>=0;j--)            {                dp[j]=max(dp[j],dp[j-c[i]]*w[i]);            }        }        int money=0;        for(int i=v;i>=0;i--)        {            if(flag<=dp[i])            {                money=i;                break;            }        }        printf("Case %d: %d\n",ii,money);    }    return 0;}//寇瑟茹酒
原创粉丝点击