经典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[N];
int n,v;
int w[N];
double c[N];
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();
}
}

本文介绍了一种01背包问题的概率变形版本,通过计算不同物品携带与否的概率来求解最优值。文中给出的C++代码实现了这一算法,并通过迭代更新动态规划数组来找到至少携带一件物品的概率。
3万+

被折叠的 条评论
为什么被折叠?



