看脸的时候到了☆
随机化!
重复!
DP的Flag倒下了!
夏天没有西瓜!
总之有非常看脸的随机做法
也有非常靠谱的DP做法
DP是bool型
判断前i个人里选j个能不能达到k
随机化
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define LL long long
#define MOD 1000000007
#define pi 3.141592653589
using namespace std;
int sum1,sum2=99999999,w[105],n;
void randnum()
{
int i,x;
for(i=1;i<=n;i++)
{
x=rand()%n+1;
while(x==i) x=rand()%n+1;
swap(w[i],w[x]);
}
}
void getans()
{
int ans1=w[1],ans2=0,t1=1,t2=0,i;
for(i=2;i<=n;i++)
{
if(t1==t2-1)
{
ans1+=w[i];
t1++;
}
else
{
ans2+=w[i];
t2++;
}
}
if(ans1>ans2) swap(ans1,ans2);
if(abs(ans1-ans2)<abs(sum1-sum2))
{
sum1=ans1;
sum2=ans2;
}
}
int main()
{
int i;
srand(time(0));
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=100000;i++)
{
getans();
randnum();
}
printf("%d %d",sum1,sum2);
return 0;
}
DP
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#define LL long long
#define MOD 1000000007
#define pi 3.141592653589
using namespace std;
int n,i,w[105],s,p,dp[105][45005],k,j,ans1,ans2;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
s+=w[i];
}
p=(n+1)/2;
dp[0][0]=1;
dp[1][0]=1;
for(i=1;i<=n;i++)
for(j=p;j>=0;j--)
for(k=s/2;k>=0;k--)
if(dp[j][k]) dp[j+1][k+w[i]]=1;
for(i=s/2;i>=1;i--)
if(dp[p][i])
{
ans1=i;
break;
}
ans2=s-ans1;
printf("%d %d",min(ans1,ans2),max(ans1,ans2));
return 0;
}