[CODEVS 1959]拔河比赛

12 篇文章 0 订阅
1 篇文章 0 订阅

原题链接

看脸的时候到了☆

随机化!
重复!
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值