HDU 2955(01背包)
2024-08-25 09:29:57
http://acm.hdu.edu.cn/showproblem.php?pid=2955
这道题求不被抓时的最大金钱。金额是整数,概率是小数。因为数组小标不能是小数,所以我们可以以钱作为weight,概率作为value。
这说明解背包问题时cost和weight不是定死的,是可以相互转换的。
以银行的的总金额作为V,安全概率作为value,金额作为cost,安全概率=各家银行安全概率之积
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std; #define MEM(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define debug printf("!/m")
#define INF 8000
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ep 1e-6 double dp[INF]; double ci[INF];//容量
int wi[INF];//价值
int n,V,i,j,v,t,sum;
double vi; void zeroOnePack(int cost,double weight)
{
for(v = sum;v>=cost;v--)
{
dp[v] =MAX(dp[v],dp[v-cost]*weight);
}
} void completePack(int cost,int weight)
{
for(v = cost;v<=V;v++)
{
dp[v] =MAX(dp[v],dp[v-cost]+weight);
pf("tt%d %d %d\n",i,v,dp[v]);
} } int main()
{ sf("%d",&t);
while(t--)
{
sf("%lf%d",&vi,&n); MEM(dp,);
dp[] = 1.0; MEM(ci,);
MEM(wi,); vi = -vi; sum = ; for(i = ;i<=n;i++)
{
sf("%d",&wi[i]);
sf("%lf",&ci[i]);
ci[i] = -ci[i];
sum+=wi[i];
} for(i = ;i<=n;i++)
{
zeroOnePack(wi[i],ci[i]);
} for(i = sum;i>=;i--)
{
if(dp[i]-vi>0.000000001)
{
pf("%d\n",i);
break;
}
}
}
return ;
}
78MS
最新文章
- 易货beta版本项目展示报告
- java中Class.getResource用法
- 参考SQLHelper编写的OracleHelper
- Linux内存管理 (17)KSM
- webpack 4.0配置2
- 第 16 章 C 预处理器和 C 库(直角坐标转换极坐标)
- jquery操作radio,checkbox
- jquery所有版本下载外链地址
- Java知多少(26)源文件的声明规则
- SQL Server 通过TSQL(存储过程)用MSXML去调用Webservice
- C# 程序设置开机启动(一)
- Java DecimalFormat的主要功能及使用方法
- JavaScript初级面试题
- C# 温故而知新:Stream篇(二)
- CentOS7安装步骤详解
- (剑指Offer)面试题42:翻转单词顺序
- GUI的广泛应用是当今计算机发展的重大成就之一
- Java-Runoob:Java 方法
- CAN2.0A帧格式 与 LIN帧格式 简单说明
- Nginx负载均衡案例