您的位置:首页 > Web前端

hdu 1203 I NEED A OFFER! 变形01背包

2016-10-21 22:55 405 查看
经典01背包的变形

事件1发生的概率为p1,事件2发生的概率为p2,..pn,那么n件中至少发生一件就是一件也不发生的逆事件 p = 1-[(1-p1)(1-p2)..(1-pn)]

#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
const int N = 10001;
double dp
;
int n,v;
int w
;
double c
;
void pack()
{
//memset(dp,0,sizeof(dp));//double类型只能用这个清零
fill(dp,dp+N,1);
for(int i=0;i<n;i++)
for(int j=v;j>=w[i];j--)
{
double v1 = dp[j]; //相当于背包拿最小值
double v2 = dp[j-w[i]]*(1-c[i]);
if(v1>v2)dp[j]=v2;
else dp[j] = v1;
}
cout<<setiosflags(ios::fixed)<<setprecision(1)<<(1-dp[v])*100<<"%"<<endl;
}
int main()
{
while(cin>>v>>n&&(v!=0||n!=0))
{
for(int i=0;i<n;i++)
{
cin>>w[i]>>c[i];
}
pack();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: