hdu 1203 I NEED A OFFER!(01背包)

他可以收到至少一份offer的最大概率,即答案为1-最小失败率,贪心0ms,01背包15ms 贪心:

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAXNUM 1005

struct node
{
    int cost;
    double pro;
}school[MAXNUM];

bool mycmp(const node &n1,const node &n2)
{
    if(n1.pro!=n2.pro) return n1.pro<n2.pro;
    else return n1.cost<n2.cost;
}

int main()
{
    int n,money;
    while(scanf("%d %d",&money,&n),n+money)
    {
        int i;
        double t;
        for(i=0;i<n;i++)
        {
            scanf("%d %lf",&school[i].cost,&t);
            school[i].pro=1.0-t;
        }
        sort(school,school+n,mycmp);
    //    for(i=0;i<n;i++) printf("%f %d\n",school[i].pro,school[i].cost);
        t=1.0;
        for(i=0;i<n;i++)
        {
            if(money - school[i].cost >= 0)
            {
                money-=school[i].cost;
                t*=school[i].pro;
            }
            else break;
        }
        printf("%.1f%%\n",(1.0-t)*100.0);
    }
    return 0;
}

 

//***********************************************************

01背包:

#include <stdio.h>
#include <string.h>

#define MAXN 1005
#define MAXM 10005

int w[MAXN];
double v[MAXN],f[MAXM];

inline double Min(double a,double b)
{
    return a<b?a:b;
}
void ZeroOnePack(int weight,double value,int total)
{
    int j;
    for(j=total; j>=weight; j--)
    {
        if(j>=weight)
        {
            f[j] = Min( f[j],f[ j-weight ]*value);
        }
    }

}

int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n),m+n)
    {
        int i;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&w[i]);
            scanf("%lf",&v[i]);
            v[i]=1.0-v[i];
        }
        for(i=0; i<=m; i++) f[i]=1.0;
        for(i=1; i<=n; i++) ZeroOnePack(w[i],v[i],m);
        printf("%.1f%%\n",100.0*(1.0-f[m]));
    }
    return 0;
}

posted @ 2010-08-30 16:34  菜到不得鸟  阅读(281)  评论(0)    收藏  举报