rt。违规紫衫。
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+10;
const double EPS=1e-7;
int n,w,a[N],b[N];
double dp[N],c[N];
bool Check(double x)
{
for(int i=1;i<=n;++i)c[i]=a[i]-b[i]*x;
for(int i=1;i<=w;++i)dp[i]=-1e9;
for(int i=1;i<=n;++i)
{
for(int j=w;j>=0;--j)
{
int k=min(w,j+b[i]);
dp[k]=max(dp[k],dp[j]+c[i]);
}
}
return dp[w]>0;
}
int main()
{
scanf("%d%d",&n,&w);
for(int i=1;i<=n;++i)
{
scanf("%d%d",&b[i],&a[i]);
}
double l=0,r=1e9;
while(r-l>EPS)
{
double mid=(l+r)/2;
if(Check(mid))
{
l=mid;
}
else
{
r=mid;
}
}
printf("%.0lf\n",floor(l*1000+EPS));
return 0;
}
上述代码中,手动赋值 −1×109 可以通过。也就是这行:
for(int i=1;i<=w;++i)dp[i]=-1e9;
而使用 memset 赋值极小值样例却输出 1099。
(double类memset附 128 可以做到赋值极小值)
memset(dp,128,sizeof(dp));
dp[0]=0;
有没有大佬解释一下差别或者为什么输出错误吗QAQ?