AHU524 桂园食堂

来源:互联网 发布:网络作家丁凡个人资料 编辑:程序博客网 时间:2024/04/27 20:42

动归第一题,背包的模板。。。主要是浮点数精度的问题,在浮点数的表示法中,两个数之间的差值是用距离来表示的,因此相差极小的两个数,运算之后可能用同一个数来表示了。那么如何判断两个数相等呢?答案是:差值小于一个足够小的数,比如0.00000001这种。(硕神博客学来的。。。)然后要加0.01.

#include<stdio.h>double a[120][10020];int main(){    int kind,i;    double money,mo[2000],va[2000],i1;    while(scanf("%d %lf",&kind,&money)!=EOF)     {        for(i=1;i<=kind;i++)         scanf("%lf %lf",&mo[i],&va[i]);        for(i=0;i<=kind;i++)           for(i1=0;i1-money<=1e-2;i1+=0.1)             {                  a[i][(int)((i1+0.01)*10)]=0;                 if(i!=0)                {                  if(i1>=mo[i])                  {                  a[i][(int)((i1+0.01)*10)]=a[i-1][(int)((i1+0.01)*10)]>a[i-1][(int)((i1-mo[i]+0.01)*10)]+va[i]?a[i-1][(int)((i1+0.01)*10)]:a[i-1][(int)((i1-mo[i]+0.01)*10)]+va[i];                   }                  else  a[i][(int)((i1+0.01)*10)]=a[i-1][(int)((i1+0.01)*10)];                }             }        printf("%.1lf\n",a[kind][(int)((money+0.01)*10)]);     }     return 0; }
0 0
原创粉丝点击