不懂就问这道题可以用滚动数组吗
查看原帖
不懂就问这道题可以用滚动数组吗
699852
bzzltl楼主2023/6/27 23:01

rt。

改前过了,把第一位删去后46.

46代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+6;
const int M=1e3+7;
const int IM=214748364;
const long long LLM=9223372036854775807;

inline int read()
{
	int x=0,y=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-y;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^'0');c=getchar();}
	return x*y;
}

int n,sum,a[N],b[N],f[6*N];

signed main()
{
//	freopen("1.in","r",stdin);
	n=read();
	for(int i=1;i<=n;i++) a[i]=read(),b[i]=read(),sum+=a[i]+b[i];
	for(int i=1;i<=n;i++) for(int j=0;j<=6*n;j++) f[j]=IM;
	f[a[1]]=0,f[b[1]]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=6*n;j;j--)
		{
			if(j>=a[i]) f[j]=min(f[j],f[j-a[i]]);
			if(j>=b[i]) f[j]=min(f[j],f[j-b[i]]+1);
		}
	}
	int minD=IM,minT=IM;
	for (int i=0;i<=6*n;i++)
		if(f[i]!=IM)
		{
			if(abs(2*i-sum)<minD)	minD=abs(i-(sum-i)),minT=f[i];
			else if(abs(2*i-sum)==minD) minT=min(minT,f[i]);
		}
	printf("%d", minT);
	return 0;
}
2023/6/27 23:01
加载中...