• HDU_2955 Robberies(01背包问题)


      ps:这两天忙着搬宿舍都快忙晕了,今天终于有空复习一下01背包问题。

    对动态规划不熟,方法还是看的解题报告。还是根据01背包的动态转移方程:dp[j] = max{dp[j], dp[j-c[i]] + w[i]}。只不过这里要做一下转变,将银行的总钱数作为背包容量V,每个银行的钱数作为c[i],抢每个银行不被抓住的概率作为w[i]。

    结构体定义

    struct node

    {

      int money;

      double p;

    }r[N]

    动态转移方程改为:dp[j] = max{dp[j], dp[j-r[i].money]*(1-r[i].p)}。也就是求不被抓住的概率最大。


    代码如下:

    #include <iostream>
    #include
    <cstdio>
    #include
    <cstring>

    using namespace std;
    const int N = 10005;

    struct ro
    {
    int m;
    double p;
    }r[
    105];

    double dp[N];

    int main()
    {
    //freopen("data.in", "r", stdin);

    int T;
    scanf(
    "%d", &T);
    while(T--)
    {
    double P;
    int n, i, j, sum = 0;
    scanf(
    "%lf%d", &P, &n);
    for(i = 1; i <= n; i++)
    {
    scanf(
    "%d%lf", &r[i].m, &r[i].p);
    sum
    += r[i].m;
    }
    memset(dp,
    0, sizeof(dp));
    dp[
    0] = 1;
    for(i = 1; i <= n; i++)
    for(j = sum; j >= r[i].m; j--)
    dp[j]
    = dp[j] > dp[j-r[i].m]*(1-r[i].p) ? dp[j] : dp[j-r[i].m]*(1-r[i].p);
    for(i = sum; i >= 0; i--)
    if(dp[i] >= (1-P))
    {
    printf(
    "%d\n", i);
    break;
    }
    }
    return 0;
    }

  • 相关阅读:
    ajax小白理解
    Once more
    win滚动条样式修改
    NOIP2018游记
    Stirling数笔记
    【Start From Here】HNOI2018 滚粗记
    6面相对象
    5方法定义及调用
    Java4数组
    Java3流程控制语句
  • 原文地址:https://www.cnblogs.com/vongang/p/2155742.html
Copyright © 2020-2023  润新知