比赛的时候拿贪心的代码改来改去死活Y不下来,后来跟人讨论一下才得知是个背包问题,果然自己有关背包和DP方面的理解不深啊。
具体的思路在于对当前问题的求解在于尽量使两台机器工作的时间相近,这样才能让最后结束的机器工作的时间最短。
做法的话便是排序后进行枚举,标记数值小于等于时间总和的一半的时间点。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=5005;
int dp[INF],ax[1005];
int main()
{
int N;
while(cin>>N)
{
int sum=0,dis=INF;
for(int i=0;i<N;i++)
{
cin>>ax[i];
sum+=ax[i];
}
int z=sum/2;
sort(ax,ax+N);
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<N;i++)
{
if(ax[i]<=z)
dp[ax[i]]=1;
}
for(int j=0;j<N;j++)
{
if(ax[j]>z)
break;
for(int i=z;i>0;i--)
{
if(i+ax[j]<=z)
dp[i+ax[j]]=1;
}
}
int flag=INF;
for(int j=z;j>=0;j--)
{
if(dp[j])
{
flag=j;
break;
}
}
cout<<max(flag,sum-flag)<<endl;
}
return 0;
}