码迷,mamicode.com
首页 > 其他好文 > 详细

[ACM] hdu 1203 I NEED A OFFER!(小数背包)

时间:2014-04-29 13:21:22      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:小数背包   01背包   

解题思路:

求至少收到一份OFFER的最大概率,为了简化问题,求一份OFFER也没有收到的最小概率,然后1减去它就可以了。采用01背包,装入一份OFFER也没收到总概率的最小值,那么1减去它就是收到至少一份OFFER的最大概率。注意:dp[最大容量] 要有值,初始化时,而且本题dp数组初始化值为1

代码:

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
const int maxn=10003;
int c[maxn];//消费
double p[maxn];//价值
double dp[maxn];
int n,m;

void zero()//01背包
{
    for(int i=0;i<m;i++)
        for(int j=n;j>=c[i];j--)
        dp[j]=min(dp[j],dp[j-c[i]]*(1-p[i]));//注意是乘以,不是加,独立事件概率相乘
}

int main()
{
    while(cin>>n>>m&&(n||m))
    {
        fill(dp,dp+n+1,1);//设为1,范围保证dp[n]要有值
        for(int i=0;i<m;i++)
        {
            cin>>c[i]>>p[i];
        }
        zero();
        cout<<setiosflags(ios::fixed)<<setprecision(1)<<(1-dp[n])*100<<"%"<<endl;
    }
    return 0;
}


 

[ACM] hdu 1203 I NEED A OFFER!(小数背包)

标签:小数背包   01背包   

原文地址:http://blog.csdn.net/sr_19930829/article/details/24704013

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!