动归第一题,背包的模板。。。主要是浮点数精度的问题,在浮点数的表示法中,两个数之间的差值是用距离来表示的,因此相差极小的两个数,运算之后可能用同一个数来表示了。那么如何判断两个数相等呢?答案是:差值小于一个足够小的数,比如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;
}