hdu 2955 Robberies 01背包
//以抢的钱为背包容量 求最大容量且概率又小于被抓概率的
#include <iostream>
using namespace std;
struct Bag
{
double pro;
int money;
};
Bag b[101];
double dp[10001];
inline double max(double a, double b)
{
return a>b?a:b;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
double MAX;
int n, i, j, cnt = 0;
scanf("%lf %d", &MAX, &n);
int sum = 0;
for (i = 0 ; i < n; ++i)
{
double pro;
int money;
scanf("%d %lf", &money, &pro);
if (pro <= MAX)
{
b[cnt].money = money;
b[cnt++].pro = 1 - pro;
sum += money;
}
}
for (i = 0; i <= sum; ++i)
{
dp[i] = 1;
}
MAX = 1 - MAX;
dp[b[0].money] = b[0].pro;
for (i = 1; i < cnt; ++i)
{
for (j = sum; j >= b[i].money; --j)
{
int k = j-b[i].money;
if (dp[k] != 1 || k == 0)
{
if (dp[j] == 1)
{
dp[j] = dp[k]*b[i].pro;
}
else
{
dp[j] = max(dp[j], dp[k]*b[i].pro);
}
}
}
}
dp[0] = MAX + 2;
for (i = sum; i >= 0; --i)
{
if(dp[i] != 1 && dp[i] > MAX)
{
printf("%d\n", i);
break;
}
}
}
return 0;
}
#include <iostream>
using namespace std;
struct Bag
{
double pro;
int money;
};
Bag b[101];
double dp[10001];
inline double max(double a, double b)
{
return a>b?a:b;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
double MAX;
int n, i, j, cnt = 0;
scanf("%lf %d", &MAX, &n);
int sum = 0;
for (i = 0 ; i < n; ++i)
{
double pro;
int money;
scanf("%d %lf", &money, &pro);
if (pro <= MAX)
{
b[cnt].money = money;
b[cnt++].pro = 1 - pro;
sum += money;
}
}
for (i = 0; i <= sum; ++i)
{
dp[i] = 1;
}
MAX = 1 - MAX;
dp[b[0].money] = b[0].pro;
for (i = 1; i < cnt; ++i)
{
for (j = sum; j >= b[i].money; --j)
{
int k = j-b[i].money;
if (dp[k] != 1 || k == 0)
{
if (dp[j] == 1)
{
dp[j] = dp[k]*b[i].pro;
}
else
{
dp[j] = max(dp[j], dp[k]*b[i].pro);
}
}
}
}
dp[0] = MAX + 2;
for (i = sum; i >= 0; --i)
{
if(dp[i] != 1 && dp[i] > MAX)
{
printf("%d\n", i);
break;
}
}
}
return 0;
}