hdoj1203 I NEED A OFFER!(DP,01背包)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1203

思路

求最少能收到一份offer的最大概率,可以先求对立面:一份offer也收不到的最小概率,然后使用1减去最小概率即可。由于一份offer也收不到的最小概率需要用乘法来解决,所以该题的状态转移方程为: dp[j] = min(dp[j], dp[j - v[i]] * w[i]) ,其中v[i]为第i个申请的申请费,w[i]为第i个申请收不到offer的概率,dp[j]为在j万美元的情况下,所有的申请全部都没有获得offer的最小概率。注意数组dp[]要初始化为1。

代码

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = + ;
int v[N];
double w[N];
double dp[N]; int main()
{
//freopen("hdoj1203.txt", "r", stdin);
int n, m;
while (cin >> n >> m && (n + m))
{
for (int i = ; i < m; i++)
{
cin >> v[i] >> w[i];
w[i] = - w[i];
} for (int i = ; i <= n;i++)
dp[i] = ;
for (int i = ; i < m; i++)
{
for (int j = n; j >= v[i]; j--)
dp[j] = min(dp[j], dp[j - v[i]] * w[i]);
}
printf("%.1lf%%\n", ( - dp[n]) * );
}
return ;
}
上一篇:黄聪:多个wordpress网站(不同域名)共享用户数据的方法


下一篇:线性代数笔记24——微分方程和exp(At)