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;
}
浙公网安备 33010602011771号