杭电1203(0/1背包+滚动数组+一点点概率知识)

1.先找最小的失败率,再用1-这个失败率,即得最大拥有最少一个offer的概率。
2.感觉这个题目应该要初始化的吧。。。。。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 10010;
int volume[INF];
double value[INF];
double dp[INF];
double MIN(double a,double b)
{
    
    
    if(a<b)
    {
    
    
        return a;
    }
    else
    {
    
    
        return b;
    }
}
int main()
{
    
    
    int n,m;
    while(scanf("%d%d",&n,&m)&&(n+m))
    {
    
    
        for(int i=0;i<=n;i++)
        {
    
    
            dp[i]=1;
        }
        memset(value,0,sizeof(value));
        memset(volume,0,sizeof(volume));
        for(int i=0;i<m;i++)
        {
    
    
            scanf("%d%lf",&volume[i],&value[i]);
            value[i]=1-value[i];
        }
        for(int i=0;i<m;i++)
        {
    
    
            for(int j=n;j>=volume[i];j--)
            {
    
    
                //cout<<"ok"<<endl;
                dp[j]=MIN(dp[j],dp[j-volume[i]]*value[i]);
            }
        }/*
        //cout<<"---------------"<<endl;
        for(int i=0;i<=n;i++)
        {
            //printf("%.1lf%%\n",value[i]*100);
            //printf("%.6lf\n",dp[i]);
            //printf("%.1lf%%\n",(1-dp[i])*100);
        }*/
        //cout<<endl;
        double ans=1;
        for(int i=0;i<=n;i++)
        {
    
    
            ans=MIN(ans,dp[i]);
        }
        printf("%.1lf%%\n",(1-ans)*100);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mingjiweixiao/article/details/114780717
今日推荐