SDUTOJ 1130 拔河

原创 2013年12月04日 11:25:31

SDUTOJ 1130 拔河                         题目链接:http://sdjzu.acmclub.com/index.php?app=problem_title&id=147&problem_id=1130

题目分析:将一个数组内元素拆成两个数组,使其差值尽量小,可以转化为01背包问题。总数已知,那么求出较小的,较大的也就自己出来了。较小的(或相等)的那个上界是总重量的一半,这就是01背包的容量。然后就是常规01背包问题了。

状态转移:

    方程伪代码(优化前):

dp[i][v]=max(dp[i-1][v],dp[i-1][v-c[i]]+w[i])
显然这是个二维的,但其空间复杂度可优化,优化后如下:

for i=1..N
     for v=V..0 
        dp[v]=max{dp[v],dp[v-c[i]]+w[i]};
    思想:i意为当前走到第i件物品(装不装进去要看转移方程),v意为当前背包容量(如需优化,则要从大到小)。走到第i件物品时,要看当前物品能否装入背包,若能,再看装入背包后价值是否增加,若增加,就装入此物品。

code:

#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int n,i,j,sum,a[110],dp[500000];
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        memset(dp,0,sizeof(dp));
        for(i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        for(i=1; i<=n; i++)
        {
            for(j=sum/2; j>=0; j--)
            {
                if(j>=a[i])
                {
                    dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
                }
            }
        }
        printf("%d %d\n",dp[sum/2],sum-dp[sum/2]);
    }
    return 0;
}
PS:此处已优化为一维(不优化不行,100*50000是5百万,存不下)

//未赋初值、输出答案错误等wrong2,数组开小RE2

PSS:九讲走起~







相关文章推荐

1130: 拔河

1130: 拔河 时间限制: 3 Sec 内存限制: 32 MB 提交: 261 解决: 65 提交状态 题目描述 小明班里要举行一次拔河比赛...

拔河分组

有12个同学要分成两个组进行拔河比赛,为使比赛公平,分组时要求每组6个同学,且两组的体重之和相等;已知这12个同学的体重分别为:38、39、47、35、46、58、51、42、36、40、59、39;...

xyoj 1130:拔河

题目描述 小明班里要举行一次拔河比赛,班主任决定将所有人分为两队,每个人都必须参加。两个队伍的人数之差不能超过1,并且两个队伍的体重之和要尽可能相近,当然相同是最好的了。 输入格式 ...

科技公司与用户隐私的“拔河”战争

每个人手中的智老手机上装满了百般Apps,跟着起色汇集各种交际搜集Apps的奋发,个人秘密比PC工夫受到更大吐露的畏惧,每个帐号后背的主人的存在都被窥视着,在发出“状态”或像片的时辰,帐号主人的隐私就...

端午节拔河比赛

2012年的端午节 过的非常有意义 这一天 我们传智的同学们在中关村软件园举行的首届拔河比赛 场面非常的隆重 我也很荣幸 为此次活动表演了开场舞(街舞表演) 更为重要的是 在我们全班的努力下 ...

拔河游戏机——ABLE-HDL语言实现

ABLE-HDL语言实现拔河游戏机用7个发光二极管排列成一行,开机后只有中间一个发亮,以此作为拔河的中心线,游戏双方各持一个按键,迅速地、不断地按动产生脉冲,谁按得快,亮点向谁方向移动,每按一次,亮点...

codevs1959拔河比赛[三星~]

题目链接:————————————>戳我~题目描述 Description一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所...

Rqnoj 题目 72拔河比赛 (01背包)

PID72 / 拔河比赛 ☆ 提交你的代码查看讨论和题解 22秒前 我的状态 已通过 2015-09-20 00:37:32 运行耗时:36 ms 运行内存:1...

1959 拔河比赛[DP][随机化贪心※]

可达性DP#include #include #include using namespace std; int n,k; int a[12341],sum,mi=10000000; bool f[...

动态规划 之 拔河比赛人员分配问题

动态规划之0-1背包问题的应用实例:拔河问题: n 个人参加拔河比赛,每个人有自己的重量,现在需要把他们分成两组进行比赛,每个人属于其中的一个组,两组的人员个数相差不能超过1。为使比赛公平,求使得两组...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SDUTOJ 1130 拔河
举报原因:
原因补充:

(最多只允许输入30个字)