代码改变世界

HDU--1203 I NEED A OFFER!(01背包)

2013-12-16 00:46  gongti  阅读(158)  评论(0)    收藏  举报
题目http://acm.hdu.edu.cn/showproblem.php?pid=1203
分析:这题和抢劫银行是一样的。至少获得一个学校的概率等于1 减去一个offer都不获得。
所以转变为一个都不获得的最小值。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;


int n,m,v[10010];
float p[10010],dp[10010];

float ZeroOnePack()
{
  for(int i=0;i<=m;i++)
    dp[i]=1;

  for(int i=1;i<=n;i++)
    for(int j=m;j>=v[i];j--)
      dp[j]=min(dp[j],dp[j-v[i]]*(1-p[i]));

  return (1-dp[m]);
}

int main()
{
  while (scanf("%d%d",&m,&n)!=EOF)
  {
    if(n==0&&m==0) break;

    for(int i=1;i<=n;i++)
      scanf("%d%f",&v[i],&p[i]);

    printf("%.1f%%\n",ZeroOnePack()*100);
  }
  return 0;
}