題目描述
小明途中經過某個商店,商店推出了一個新的抽獎活動,獎品恰巧是小明最愛的XXX手辦。
商店公告顯示:本商店現有n中抽獎卡,每張抽獎卡上有顯示它的中獎概率(pi)以及價格(cost),每種抽獎卡限購一張。
小明現在有m元,他想知道自己能夠獲得這個手辦的最大概率是多少?
輸入
對於每組數據第一行輸入n,m。(1<=n<=1000,1<=m<=1000)
接下來n行,每行兩個數cost,pi,其中cost爲整數;(1<=cost<=m,0<= pi <= 1)
多組測試(最多不超過100組)
輸出
樣例輸入
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