hdu2955robberies

来源:互联网 发布:ubuntu上配置samba 编辑:程序博客网 时间:2024/05/12 20:47

背包9讲中的01背包的一种变形

原型  dp[v]=max(dp[v],dp[v-c[i]]+w[i]);


对于本题进行分析 ;

  背包容量 = 所有银行的钱数之和 sum+=c[i]  i=0,1......n;

  花费是被抓住的概率   价值是偷到的钱

  因此不难推得  dp[v]=max(dp[v],dp[v-c[i]]*w[i]);  注意 dp为double型  精度不止两位

代码如下:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){    int t;    cin>>t;    double dp[10000],p;    double w[100];    int c[100],n;    while(t--)    {        cin>>p>>n;        int count=0;        for(int i=0;i<n;i++)        {            cin>>c[i]>>w[i];            count+=c[i];        }        memset(dp,0,sizeof(dp));        dp[0]=1.0;        for(int i=0;i<n;i++)            for(int v=count;v>=c[i];v--)                dp[v]=max(dp[v],dp[v-c[i]]*(1-w[i]));        for(int i=count;i>=0;i--)        {            if(dp[i]>=1-p)            {                cout<<i<<endl;                break;            }        }    }    return 0;}

0 0
原创粉丝点击