现在的位置: 首页 > 综合 > 正文

HDU_2955 Robberies(01背包问题)

2013年07月31日 ⁄ 综合 ⁄ 共 793字 ⁄ 字号 评论关闭

  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;
}

抱歉!评论已关闭.