天天写算法之Robberies

本文探讨了一种基于动态规划的偷窃问题解决方案,通过使用概率和价值作为关键参数,实现了一个具体的算法实例。该算法考虑了不同银行的偷窃价值和被抓的概率,并通过动态规划方法来计算最大可能的收益。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题,一开始做的时候,我竟然天真的按着案例相加,竟然全对上了,于是就上了贼船,用possible作为了容器。

但后来看了一些资料以后,发现应该用总的value作为容器,求得是价值,以价值为消耗来做。不可以用possible的原因是,初始化的时候都为0,显然是不合理的。
最后还被一个地方卡了半天,那就是可能一分钱都没偷到,百分之百不被抓~。   ~
#include <iostream>
#include <iomanip>
#include<queue>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<iomanip>
#include<string.h>
#include<sstream>
#include<string>
#include<queue>
#define MAX 5842
//¶¨Ò庯Êý¶Î
#define repf(i,a,b) for(int i =(a);i<(b);i++)
#define repfe(i,a,b) for(int i =(a);i<=(b);i++)
using namespace std;

struct bank{
public :

   double possible;
   int value ;
};
bank banks[150];
double dp[15000];


int main() {

    int num ,num_banks,sum_money;
    double p;
    cin >> num ;
    while (num --)
    {
        cin >>p>>num_banks;
        sum_money = 0 ;
        repfe(i,1,num_banks)
        {
           // scanf("%d%lf",&banks[i].value,&banks[i].possible);
           cin>> banks[i].value>>banks[i].possible ;
           sum_money+=banks[i].value;
        }

        memset(dp,0,sizeof(dp));
        dp[0]=1.0;
        repfe(i,1,num_banks)
        {
            for(int j = sum_money ; j >=banks[i].value;j --)
            {
                dp[j] = max(dp[j],dp[j-banks[i].value]*(1.0-banks[i].possible));
            }
        }

        for(int i = sum_money;i>=0;i--)
        {
            if(1-dp[i]<p)
            {
                printf("%d\n",i);
                break ;
            }
        }

    }

    return 0 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值