求教关于memset与手动赋初值的差异
查看原帖
求教关于memset与手动赋初值的差异
1026751
Lawrenceling楼主2024/8/16 19:26

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;
//	memset(dp,128,sizeof(dp));
//	dp[0]=0;
	
	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-1 \times 10^9 可以通过。也就是这行:

for(int i=1;i<=w;++i)dp[i]=-1e9;

而使用 memset 赋值极小值样例却输出 10991099。 (double类memset附 128 可以做到赋值极小值)

memset(dp,128,sizeof(dp));
dp[0]=0;

有没有大佬解释一下差别或者为什么输出错误吗QAQ?

2024/8/16 19:26
加载中...