題目:
I NEED A OFFER!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22398 Accepted Submission(s): 8957
後面的m行,每行都有兩個數據ai(整型),bi(實型)分別表示第i個學校的申請費用和可能拿到offer的概率。
輸入的最後有兩個0。
描述:給定揹包的容量n和物品數m,每種物品有它的消耗以及獲得價值的概率,求獲得至少一個物品的價值的最大概率。
題解:考慮dp[i]爲容量爲i的揹包拿不到某物品價值的最小概率,循環m次即可。注意一開始dp全部是1。本以爲1e10會T結果沒有,看來數據水。
代碼:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 10005;
struct offer
{
int f;
double p;
}a[maxn];
double dp[maxn];
int main()
{
//freopen("input.txt", "r", stdin);
int n, m;
while (scanf("%d%d", &n, &m), n || m)
{
for (int i = 0; i < m; i++)
scanf("%d%lf", &a[i].f, &a[i].p);
for (int i = 0; i <= n; i++)
dp[i] = 1.0;
for (int i = 0; i < m; i++)
for (int j = n; j >= a[i].f; j--)
dp[j] = min(dp[j], dp[j - a[i].f] * (1 - a[i].p));
printf("%.1lf%%\n", (1 - dp[n]) * 100);
}
return 0;
}