码迷,mamicode.com
首页 > 其他好文 > 详细

【动态规划】数字分组I

时间:2016-08-11 20:50:56      阅读:584      评论:0      收藏:0      [点我收藏+]

标签:

【动态规划】数字分组I

时间限制: 1 Sec  内存限制: 64 MB
提交: 10  解决: 6
[提交][状态][讨论版]

题目描述

给出一堆魔法石的重量,问如何分成两堆,使得它们质量和之差最小,求出这个最小值。

输入

第一行一个数n (n ≤30)。 接下来n行,每行一个正整数。(每个数≤100000)

输出

 一个整数表示两组数字和的最小差。

样例输入

5
1 2 3 4 5

样例输出

1

将问题转化为求背包容量为所有数总和一半的背包问题
技术分享
#include <iostream>
#include <cstring>

using namespace std;
int f[1555555]={0},sum,n;
int a[33];
int main()
{
    cin>>n;
    sum=0;
    memset(f,0,sizeof(f));
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=sum/2;j>=a[i];j--)
        {
            f[j]=max(f[j],f[j-a[i]]+a[i]);
        }

    }
    cout<<sum-2*f[sum/2]<<endl;
    return 0;
}
View Code

 

 

【动态规划】数字分组I

标签:

原文地址:http://www.cnblogs.com/asuml/p/5762440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!