【动态规划】数字分组I

问题 M: 【动态规划】数字分组I

时间限制: 1 Sec  内存限制: 64 MB
提交: 106  解决: 59
[提交] [状态] [讨论版] [命题人:]

题目描述

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

输入

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

输出

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

样例输入

5
1 2 3 4 5

样例输出

1

分析:设置背包总量为总和一班。。之前有类似的题,这个比较水。

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int n,a[35],dp[1500005],sum;
void init(){
    cin>>n;
    fill(dp,0);
    range(i,0,n-1){
        cin>>a[i];
        sum+=a[i];
    }
}
void solve(){
    range(i,0,n-1)
    rerange(j,sum>>1,a[i])dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
    cout<<sum-(dp[sum>>1]<<1)<<endl;
}
int main() {
    init();
    solve();
    return 0;
}
View Code

 

posted @ 2018-07-21 17:49  RhythmLian  阅读(323)  评论(0编辑  收藏  举报