题解洛谷P2392(c++解法)kkksc03考前临时抱佛脚

输入N个数,将这N个数能够分成两组,使得两组总数最接近就是本题的解法。可以用搜索,递归,也可以用01背包。由于我太弱……所以用的深搜……

#include
#include
#include
#define MAXN 25
#define MAXM 610
using namespace std;
int s1,s2,s3,s4;
inline int read()
{
	int date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
int work(int n)
{
	int m=0;
	int a[MAXN],f[MAXM];
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		m+=a[i];
	}
	for(int i=1;i<=n;i++)
	for(int j=m/2;j>=a[i];j--)
	f[j]=max(f[j],f[j-a[i]]+a[i]);
	return max(f[m/2],m-f[m/2]);
}
int main()
{
	s1=read();s2=read();s3=read();s4=read();
	int ans=work(s1)+work(s2)+work(s3)+work(s4);
	printf("%d\n",ans);
	return 0;
}

你可能感兴趣的:(题解洛谷P2392(c++解法)kkksc03考前临时抱佛脚)