hdu 2955 Robberies 01背包

python 使用动态规划解决01背包 支持浮点数据 使用 问题描述 具体内容来自于《算法分析与设计——C++语言描述》(第三版 陈慧南编著)。网上大多数只能搜到整型数据的背包问题,其转移方程中有需要根据索引【j-w[i]】来读取数组数据进行计算的,而如果重量数组w是浮点型,就没法使用那种转移方程了。 所以看了这本书的动态规划内容,其使用阶跃点来求解问题。我也根据书中给的算法使用python实现了一下,但是存有问题,希望能有人可以帮助我一下。 代码部分 1 常见的那种支持整型数据的 ''' 说明:代码直接从我的文件中copy出来的 具体求解的问题,可以看 阅读详情

Robberies

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25589    Accepted Submission(s): 9432

Problem Description
The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they become too greedy. He has decided to work in the lucrative business of bank robbery only for a short while, before retiring to a comfortable job at a university.


For a few months now, Roy has been assessing the security of various banks and the amount of cash they hold. He wants to make a calculated risk, and grab as much money as possible.
His mother, Ola, has decided upon a tolerable probability of getting caught. She feels that he is safe enough if the banks he robs together give a probability less than this.  

Input
The first line of input gives T, the number of cases. For each scenario, the first line of input gives a floating point number P, the probability Roy needs to be below, and an integer N, the number of banks he has plans for. Then follow N lines, where line j gives an integer Mj and a floating point number Pj . 
Bank j contains Mj millions, and the probability of getting caught from robbing it is Pj .  

Output
For each test case, output a line with the maximum number of millions he can expect to get while the probability of getting caught is less than the limit set.

Notes and Constraints
0 < T <= 100
0.0 <= P <= 1.0
0 < N <= 100
0 < Mj <= 100
0.0 <= Pj <= 1.0
A bank goes bankrupt if it is robbed, and you may assume that all probabilities are independent as the police have very low funds.
 
Sample Input
  
3 0.04 3 1 0.02 2 0.03 3 0.05 0.06 3 2 0.03 2 0.03 3 0.05 0.10 3 1 0.03 2 0.02 3 0.05
 
Sample Output
  
2 4 6
 
Source

哇这个01背包真的是,以后好好学英语嗯 微笑
已经从网上看了无数个版的题解,终于。
嗯路还长慢慢走。

题意:想抢银行,但是有风险。
第一行是测试组数t,
第二行是抢银行需 要低于的概率(浮点型)p和计划抢的银行数n,
接下来n行,第一个数是银行钱数,第二个是被抢概率(浮点型)。
 题解:需要转换,把银行钱数j当成背包 价值v,被抓概率p当成重量p,求最大逃跑概率,然后输出最多的钱。
状态转移方程: dp[j] = max(dp[j],dp[j-bag[i].v]*(1-bag[i].p));  ( 概率是 (1-p1)* (1-p2)*(1-p3)...
#include<stdio.h> 
#include<string.h> 
#include<algorithm>  
using namespace std;  
const int maxn = 50005;
double dp[maxn]; 
struct zeroonebag  //定义01背包
{  
    int v;  
    double p;  
}bag[maxn];  
 
int main()  
{  
    int t,n;  
    double p;  
    scanf("%d",&t); 
    while(t--)  
    {  //需要低于的概率p,n是银行数, 
        scanf("%lf%d",&p,&n); 
        int sum = 0;  
        for(int i=0; i<n; i++)  
        { //bag[i].v 是银行钱数 bag[i].p 抢劫概率 
            scanf("%d%lf",&bag[i].v,&bag[i].p);  
            sum = sum+bag[i].v;  
        }  
        memset(dp,0,sizeof(dp));  
        dp[0] = 1;  //如果不抢就不会被抓 
 	//外层循环是银行数目,内层循环是银行钱数
        for(int i=0; i<n; i++)  
        {  
            for(int j=sum; j>=bag[i].v; j--)  
            {  
                dp[j] = max(dp[j],dp[j-bag[i].v]*(1-bag[i].p));  
            }  
        }  
        //抢钱的数目和逃跑的概率成反比,抢的越少,越容易跑 
        for(int i=sum; i>=0; i--)  
        {  
            if(dp[i] > 1-p)  //最大的逃跑概率大于被抓概率 ,这样才不会被抓
            {  
                printf("%d\n",i);  
                break;  
            }  
        }  
    }  
    return 0;  
}  

再附上一个把0.1背包拿出来的,enmmm反正也都一样..o(´^`)o

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 50005;
double dp[maxn];
int v[maxn];
double w[maxn];
int sum,n;

void zerobag(int cost,double weight)
{
	for(int i=sum; i>=cost; i--)
		dp[i] = max(dp[i],dp[i-cost]*(1-weight));
}

int main()
{
	int t;
	double p;
	scanf("%d",&t);
	while(t--){
		scanf("%lf%d",&p,&n);
		sum=0;
		for(int i=0; i<n; i++)
		{
			scanf("%d%lf",&v[i],&w[i]);
			sum += v[i];
		}
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(int i=0; i<n; i++)
			zerobag(v[i],w[i]);
		for(int i=sum; i>=0; i--)
			if(dp[i]>=1-p)
			{
				printf("%d\n",i);
				break;
			}
	}
	return 0;
}

一花一天堂 一草一世界 一树一菩提  一土一如来 一方一净土 一笑一尘缘 一念一清净。

hdu 1864(01背包容量为浮点数 最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24694    Accepted Submission(s): 7555 Problem Description 现有一笔经费可以报销一定额度的发票。允 阅读详情

相关推荐

hdu2955 01背包 Robberies

Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21964    Accepted Submission(s): 8108 Problem Description The aspiring Ro

. 1万+

算法_动态规划_01背包问题(重量为浮点型)

问题描述和分析请查看王晓东编著的<<算法设计与分析>>P77import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Scanner;public class Main { private static int n; private stat

huangxiang360729的博客 3286

HDU 2955 Robberies 0-1背包 浮点数处理

这道题是在不被抓的概率下获取钱最多

gg_gogoing的专栏 868

hdu 2955 Robberies(01背包)

hdu 2955 Robberies (01背包)

程序员的冷浪漫 764

hdu2955 Robberies01背包

01-背包问题

1635

hdu 2955Robberies(概率dp,也可以叫01背包变形)

hdu 2955Robberies(概率dp,也可以叫01背包变形) Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they ...

serendipity的博客 221

HDU 2955 Robberies(01背包)

题目链接:HDU 2955 Robberies 01背包。 题目中给的概率精度是两位的,但是不一定都是两位的,所以没法同乘一个常数使概率变成整数,然后以把概率当成背包。这道题应该把银行总钱量当成背包。 状态转移方程:f[j]=max(f[j],f[j-q[i].money]*q[i].v),f[j]表示抢j块大洋的最大的逃脱概率。 dp[0]赋值为1(没有抢银行肯定能跑),其余dp值赋为0

fobdddf的专栏 571

hdu 2955 Robberies 01背包 Java

hdu 2955 Robberies 这道题自己写得挺久,最坑的一点是自己一开始是用 StreamTokenizer 类读取的,但是一直错,后来用 Scanner 类读取就 accept 了,搞不懂。 解这道题有以下关键点: 第一:一开始想的是用概率来作为背包容量,但是概率是浮点数,所以只能用钱来作为背包容量。 第二:题目中给出的都是被抓的概率,概率之间应该是相乘而不是相加,与一般的01背包不一样。 第三:dp[0] 注意初始化为 1, 什么都不偷逃跑的概率为 1。 import java.io.IOExc

weixin_46621409的博客 158

hdu 2955 01 背包 Robberies

题意:        好多个银行,他们很有钱。有个人想去抢劫。告诉你银行的钱和抢这个银行被抓的概率。银行被你抢一次就会没钱。现在需要你满足的条件是被抓的概率小于他给的stand,问,最多能得到多少钱。 做题过程:       这是一道很有现实主义色彩,很实用的一道题。总共就n个银行,他们钱数就是背包的容量,每个银行只抢一次,由此看出是个01背包背包出的价值(概率)最大。开始我还以为要dp出

Julyana_Lin_夜 739

hdu 2955 Robberies + LightOJ 1079 Just another Robbery (01背包 概率)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意:有一个小偷要偷银行的钱,可是他偷没家银行总是有一定的概率被抓,现在给了你一个概率P,只要他被抓的概率乘积不大与P,他就是安全的。问你在他安全的情况下,他最多可以偷多少钱。 思路:01背包。所有银行的总资产为背包容量V。求最大的逃跑概率。 题目给出被抓的概率,要求最大的逃跑率,即1-p

whyorwhnt的专栏 1118

hdu 2955 Robberies (01背包

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 思路:一开始看急了,以为概率是直接相加的,wa了无数发,这道题目给的是被抓的概率,我们应该先求出总的逃跑概率,1-逃跑概率就是最后被抓的概率,dp的话,以所有银行总金额为容量,以单个银行的金额为体积,以逃跑的概率为价值,跑01背包,最后找一下小于被抓概率的最大金额。 实现代码: #incl...

weixin_30252155的博客 106

HDU 2955 Robberies 01背包

Robberies HDU - 2955 准备抢 nnn 个银行,每个银行有对应的钱数 mmm 和相应的被抓概率 ppp,选择抢一部分银行,使得总被抓概率小于 PPP,并且得到的钱数最大。 被抓概率小于 PPP 相当于逃脱概率大于等于 1−P1-P1−P,抢的银行总共构成的逃脱概率是: ∏i(1−pi) \prod_i(1-p_i) i∏​(1−pi​) 用 dp[i]dp[i]dp[i] 表示抢...

wineandchord 154

HDU 2955——Robberies01背包变形】

题目传送门 抢劫方案最优问题,需要一个简单地转换,我们求的是不被抓的概率而非被抓的概率,各个银行的储蓄总和为背包容量,体积为单个银行的储蓄,价值为不被抓概率。 Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g...

NIRVANA REBIRTH 608

hdu2955 B - Robberies(01背包)

题目 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意 一个被抓概率pmax 一个要偷银行数n 以下n行 每行一个vi代表价值 一个pi代表被抓概率 在不超过pmax的情况下,最大化偷到的vi的价值 思路来源 https://blog.csdn.net/jianbagengmu/article/details/71091755 题...

小衣同学的博客 447

HDU2955 Robberies 一道01背包问题

HDU 2955 这一题,很有趣味。 首先,如果是按照照常的思路,在内层for循环,没办法遍历背包容量(概率),概率是double/float型的数据。 所以,将价值看成背包容量,在寻找可行的最大的价值时,将价值从大到小遍历,出现满足的概率条件时,便可以结束,此时的背包容量(价值),就是最终结果。 另外,注意,这么多银行中只要有一个银行抓住了他,就没有逃脱成功。 //HDU 2955...

117瓶果粒橙 280
上一篇: hdu 2050 折线分割平面 简单
下一篇: nyoj 开心的小明 动态规划 01背包
aaayr
博客等级 码龄9年 3粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值