概率

題目描述

小明途中經過某個商店,商店推出了一個新的抽獎活動,獎品恰巧是小明最愛的XXX手辦。

商店公告顯示:本商店現有n中抽獎卡,每張抽獎卡上有顯示它的中獎概率(pi)以及價格(cost),每種抽獎卡限購一張。

小明現在有m元,他想知道自己能夠獲得這個手辦的最大概率是多少?

輸入

對於每組數據第一行輸入n,m。(1<=n<=1000,1<=m<=1000

接下來n行,每行兩個數costpi,其中cost爲整數;(1<=cost<=m,0<= pi <= 1)

多組測試(最多不超過100組)

輸出

對於每組數據輸出,每行輸出一個答案(保留4位小數)。

樣例輸入

2 8
4 0.2500
7 0.4375
3 5
2 0.1333
2 0.1333
4 0.2667

樣例輸出

0.4375
0.2667

來源/分類

題解:

一道類似01揹包的dp
只不過是求權值乘積的最大值
但是直接求中獎概率有些難求,可以正難則反,求不中獎概率
初始f[i]=1(0<=i<=n)
狀態轉移f[j]=min(f[j],f[j-w[i]](1-v[i]))(1<=i<=m,w[i]<=j<=n)

代碼:

#include<iostream>
using namespace std;
const int maxn=1005;
int n,m;
int cost[maxn];
float p[maxn],q[maxn],f[maxn];
void dp(){
    for(int i=0;i<=m;i++) f[i]=1;
    for(int i=1;i<=n;i++)
       for(int j=m;j-cost[i]>=0;j--)
          f[j]=min(f[j],f[j-cost[i]]*q[i]);
}
int main()
{
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>cost[i]>>p[i];
            q[i]=1-p[i];
        }
        dp();
        printf("%.4f\n",1-f[m]);
    }
}

AC


 

發佈了57 篇原創文章 · 獲贊 12 · 訪問量 4828
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章