码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-09 22:40:17      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:using   注意   while   name   printf   pac   int   使用   bsp   

题目链接

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。

代码

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 const int N = 10000 + 10;
 8 int v[N];
 9 double w[N];
10 double dp[N];
11 
12 int main()
13 {
14     //freopen("hdoj1203.txt", "r", stdin);
15     int n, m;
16     while (cin >> n >> m && (n + m))
17     {
18         for (int i = 0; i < m; i++)
19         {
20             cin >> v[i] >> w[i];
21             w[i] = 1 - w[i];
22         }
23 
24         for (int i = 0; i <= n;i++)
25             dp[i] = 1;
26         for (int i = 0; i < m; i++)
27         {
28             for (int j = n; j >= v[i]; j--)
29                 dp[j] = min(dp[j], dp[j - v[i]] * w[i]);
30         }
31         printf("%.1lf%%\n", (1 - dp[n]) * 100);
32     }
33     return 0;
34 }

 

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

标签:using   注意   while   name   printf   pac   int   使用   bsp   

原文地址:http://www.cnblogs.com/sench/p/8012777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!