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。
代码
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 }
本站使用「CC BY-NC-SA」创作共享协议,转载请在文章明显位置注明作者及出处。